摘要:中的一切都可以视为对象,除了两个特例和。上例中的第三个情形已说明删除对象的属性删除属性的唯一方法是使用,将属性值设置为或只是移除了与属性相关的值,并没有真正删除属性本身。命名对象的属性对象的属性可以用普通字符或字符串来命名。
Javascript 中的一切都可以视为对象,除了两个特例:null 和 undefined。
false.toString(); // "false" [1, 2, 3].toString(); // "1,2,3" function Foo(){} Foo.bar = 1; Foo.bar; // 1
一个经常容易被误解的就是数字常量不能视为对象,实际上数字常量仍然可以视为对象。这是因为 Javascript 解析器在解析点操作符时而将其视为浮点数特征而犯下的错误。
2.toString(); // raises SyntaxError
实际上,我们有很多方法可以使得数字常量表现为一个对象。
2..toString(); // the second point is correctly recognized 2 .toString(); // note the space left to the dot (2).toString(); // 2 is evaluated first对象作为数据类型
Javascript 中的对象可以当做哈希表使用,它们主要包含键与值的对应关系。
使用 {} 符号来创建一个简单的对象,这个新建的对象将从 Object.prototype 继承而来,并且不包含自己定义的属性。
var foo = {}; // a new empty object // a new object with a "test" property with value 12 var bar = {test: 12};访问对象的属性
我们可以使用两种方式来访问 Javascript 的对象,分别是点操作符 . 和中括号操作符 [] 。
var foo = {name: "kitten"} foo.name; // kitten foo["name"]; // kitten var get = "name"; foo[get]; // kitten foo.1234; // SyntaxError foo["1234"]; // works
两种操作符的效果几乎一样,唯一的不同是中括号操作符允许动态设置属性而且属性名可以有语法错误。(上例中的第三个情形已说明)
删除对象的属性删除属性的唯一方法是使用 delete,将属性值设置为 undefined 或 null 只是移除了与属性相关的值,并没有真正删除属性本身。
var obj = { bar: 1, foo: 2, baz: 3 }; obj.bar = undefined; obj.foo = null; delete obj.baz; for(var i in obj) { if (obj.hasOwnProperty(i)) { console.log(i, "" + obj[i]); } }
上面的输出 bar undefined 和 foo null,只有 baz 真正被删除。
这里要说明一点,delete 只能删除属性,并不能删除变量。所以我们在定义变量时一定要养成写 var 的好习惯,任何时候,变量一定要使用 var 关键字才能声明。因为如果不写 var,变量会被误认给全局对象创建了一个新属性。
这个例子相当清楚给出了答案,a 为变量,而 b 只是一个全局对象的属性而已。
命名对象的属性var test = { "case": "I am a keyword, so I must be notated as a string", delete: "I am a keyword, so me too" // raises SyntaxError };
对象的属性可以用普通字符或字符串来命名。同样也是由于 Javascript 解析器的一个错误设计,上例中的第二种表示方法在 ECMAScript 5 中将会抛出一个错误。
错误的原因是因为 delete 是一个关键词,所以必须使用一个字符串常量来命名来适应老版的 Javascript 解析器。
http://bonsaiden.github.io/JavaScript-Garden/#object.general
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78055.html
因为最近有博友反馈我的博文是直接翻译的参考链接内的内容,所以我在这里要说明一下,以免引起不必要的误会。 首先,我很喜欢 segmentfault 的交流和学习的氛围,所以我很愿意在这里跟各位 SFer 交流学习心得,相互学习,共同进步。 第二,我做技术方面的工作不久,所以学习经历也不是很长,但是我发现写博客,总结自己的学习心得是个很好的学习习惯,至少对于我个人而言,我于此收益颇丰,所以我决定坚持一...
摘要:与其他编程语言相比,对的使用是一套完全不同的机制。在五种情况下的值是各有不同的。调用一个函数时在这里,同样指向全局对象。此时在函数内,指向新建的对象。尽管,晚绑定初看上去是个不好的决定,但实际上这是原型式继承工作的基础。 与其他编程语言相比,Javascript 对 this 的使用是一套完全不同的机制。this 在五种情况下的值是各有不同的。 全局作用域下 this; 当在全...
摘要:并没有类继承模型,而是使用原型对象进行原型式继承。我们举例说明原型链查找机制当访问一个对象的属性时,会从对象本身开始往上遍历整个原型链,直到找到对应属性为止。原始类型有以下五种型。此外,试图查找一个不存在属性时将会遍历整个原型链。 Javascript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承。 尽管人们经常将此看做是 Javascript 的一个缺点,然...
摘要:第二是,由于会遍历整个原型链,所以当原型链过长时,会对性能造成影响。总结建议养成过滤属性的好习惯,不要对运行环境做任何假设,也无论原生的原型对象是否被扩展。 如同 in 运算符一样,使用 for in 循环遍历对象属性时,也将往上遍历整个原型链。 // Poisoning Object.prototype Object.prototype.bar = 1; var foo = {m...
摘要:方法是中唯一一个处理对象属性而不会往上遍历原型链的。在这里,只有能给出正确答案,这在遍历一个对象的属性时是非常必要的。这里还要提醒下,当我们使用来遍历对象时,使用将会很好地避免来自原型对象扩展所带来的困扰。 判断一个属性是定义在对象本身而不是继承自原型链,我们需要使用从 Object.prototype 继承而来的 hasOwnProperty 方法。hasOwnProperty 方法...
阅读 1941·2021-10-13 09:39
阅读 3387·2021-09-30 09:52
阅读 777·2021-09-26 09:55
阅读 2753·2019-08-30 13:19
阅读 1859·2019-08-26 10:42
阅读 3158·2019-08-26 10:17
阅读 520·2019-08-23 14:52
阅读 3608·2019-08-23 14:39