Javascript 保留字和对象
Javascript reserved word and object
我正在制作一个单词词典,所以有 1,000,000 多个单词。
当我需要存储单词 constructor
时,问题就来了。我知道这是javascript中的保留字,但我需要将其添加到字典中。
var dictionary = {}
console.log(dictionary ['word_1'])
//undefined, this is good
console.log(dictionary ['word_2'])
//undefined, this is good
console.log(dictionary ['constructor'])
//[Function: Object]
// this cause initialization code to break
我该如何解决这个问题?我可以像 key=key+"_"
那样处理它,但这似乎很糟糕。还有什么我可以做的吗?
将 constructor
键替换为 undefined
根据 the MDN Object.prototype page,唯一没有被 __fieldname__
模式隐藏的是 "constructor field"。因此,您可以通过 { 'constructor': undefined }
.
初始化您的对象
但是,您必须确保在 for .. in
语句中过滤掉所有以 undefined
为值的键,因为它会将 constructor
作为 "valid" 键(即使在您专门将其设置为未定义之前它不会)。即
for(var key in obj) if(obj[key] !== undefined) { /* do things */ }
在 getting/setting
时检查类型
否则,您可以在 'fetch' 或 'store' 时检查类型。即
function get(obj, key) {
if(typeof obj[key] !== 'function') // optionally, `&& typeof obj[key] !== 'object')`
return obj[key];
else
return undefined;
}
我认为你应该将所有单词和它们的翻译存储在一个数组中。当你需要翻译一个单词时,可以使用数组的find
方法。
例如:
var dict = [
{ word: "abc", translated: "xyz" },
...
];
然后:
var searching_word = "abc";
var translation = dict.find(function (item) {
return item.word == searching_word;
});
console.log(translation.translated);
// --> xyz
您可以使用内置的 Map
类型,而不是使用 JS 对象,它使用 strings/symbols 作为键并且不与任何现有属性冲突。
替换
var dictionary = {}
和 var dictionary = new Map()
要达到预期结果,请使用以下选项使用索引获取任何键值的值
var dictionary = {};
var dictionary1 = {
constructor: "test"
};
//simple function to get key value using index
function getVal(obj, val) {
var keys = Object.keys(obj);
var index = keys.indexOf(val);//get index of key, in our case -contructor
return obj[keys[index]]; // return value using indec of that key
}
console.log(getVal(dictionary, "constructor"));//undefined as expected
console.log(getVal(dictionary1, "constructor"));//test
console.log(dictionary["word_1"]);
//undefined, this is good
console.log(dictionary["word_2"]);
//undefined, this is good
codepen - https://codepen.io/nagasai/pen/LOEGxM
为了测试,我给了一个带有键构造函数的对象,另一个没有构造函数的对象。
基本上我先获取键的索引,然后使用索引获取值
我正在制作一个单词词典,所以有 1,000,000 多个单词。
当我需要存储单词 constructor
时,问题就来了。我知道这是javascript中的保留字,但我需要将其添加到字典中。
var dictionary = {}
console.log(dictionary ['word_1'])
//undefined, this is good
console.log(dictionary ['word_2'])
//undefined, this is good
console.log(dictionary ['constructor'])
//[Function: Object]
// this cause initialization code to break
我该如何解决这个问题?我可以像 key=key+"_"
那样处理它,但这似乎很糟糕。还有什么我可以做的吗?
将 constructor
键替换为 undefined
根据 the MDN Object.prototype page,唯一没有被 __fieldname__
模式隐藏的是 "constructor field"。因此,您可以通过 { 'constructor': undefined }
.
但是,您必须确保在 for .. in
语句中过滤掉所有以 undefined
为值的键,因为它会将 constructor
作为 "valid" 键(即使在您专门将其设置为未定义之前它不会)。即
for(var key in obj) if(obj[key] !== undefined) { /* do things */ }
在 getting/setting
时检查类型否则,您可以在 'fetch' 或 'store' 时检查类型。即
function get(obj, key) {
if(typeof obj[key] !== 'function') // optionally, `&& typeof obj[key] !== 'object')`
return obj[key];
else
return undefined;
}
我认为你应该将所有单词和它们的翻译存储在一个数组中。当你需要翻译一个单词时,可以使用数组的find
方法。
例如:
var dict = [
{ word: "abc", translated: "xyz" },
...
];
然后:
var searching_word = "abc";
var translation = dict.find(function (item) {
return item.word == searching_word;
});
console.log(translation.translated);
// --> xyz
您可以使用内置的 Map
类型,而不是使用 JS 对象,它使用 strings/symbols 作为键并且不与任何现有属性冲突。
替换
var dictionary = {}
和 var dictionary = new Map()
要达到预期结果,请使用以下选项使用索引获取任何键值的值
var dictionary = {};
var dictionary1 = {
constructor: "test"
};
//simple function to get key value using index
function getVal(obj, val) {
var keys = Object.keys(obj);
var index = keys.indexOf(val);//get index of key, in our case -contructor
return obj[keys[index]]; // return value using indec of that key
}
console.log(getVal(dictionary, "constructor"));//undefined as expected
console.log(getVal(dictionary1, "constructor"));//test
console.log(dictionary["word_1"]);
//undefined, this is good
console.log(dictionary["word_2"]);
//undefined, this is good
codepen - https://codepen.io/nagasai/pen/LOEGxM
为了测试,我给了一个带有键构造函数的对象,另一个没有构造函数的对象。
基本上我先获取键的索引,然后使用索引获取值