资讯专栏INFORMATION COLUMN

数据类型对象

Half / 2751人阅读

摘要:此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量。因为圆括号的里面,只能是表达式,所以确保大括号只能解释为对象。

具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。

for..in循环 可继承
Object.keys方法 不可
JSON.stringify方法 不可
object.getpropertynames都可以遍历 不可继承

概述
生成方法
键名
对象的引用
表达式还是语句?加()里都是表达式 不加为语句
属性的操作
属性的读取
属性的赋值
属性的查看
属性的删除:delete 命令
属性是否存在:in 运算符
属性的遍历:for...in 循环
with 语句
参考链接

1.概述
1.1生成方法
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

1.2键名
1.2.1对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以
1.2.2对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以
var obj = {
1: "a",
3.2: "b",
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};

obj
// Object {
// 1: "a",
// 3.2: "b",
// 100: true,
// 0.01: true,
// 0.234: true,
// 255: true
// }

obj["100"] // true

1.2.3如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错

1.3对象的引用

拷贝的是内存地址,指向同一个
如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。

此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量。

var o1 = {};
var o2 = o1;

o1 = 1;
o2 // {}
上面代码中,o1和o2指向同一个对象,然后o1的值变为1,这时不会对o2产生影响,o2还是指向原来的那个对象。

但是,这种引用只局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。

var x = 1;
var y = x;

x = 2;
y // 1
上面的代码中,当x的值发生变化后,y的值并不变,这就表示y和x并不是指向同一个内存地址。
1.4表达式还是语句?

如果要解释为对象,最好在大括号前加上圆括号。因为圆括号的里面,只能是表达式,所以确保大括号只能解释为对象。

({ foo: 123 }) // 正确
({ console.log(123) }) // 报错
这种差异在eval语句(作用是对字符串求值)中反映得最明显。

eval("{foo: 123}") // 123
eval("({foo: 123})") // {foo: 123

2.属性的操作
2.1属性的读取

obj.p
obj["p"]

2.1.1如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。

var foo = "bar";

var obj = {
foo: 1,
bar: 2
};

obj.foo // 1
obj[foo] // 2

2.1.2方括号运算符内部还可以使用表达式。

obj["hello" + " world"]
obj[3 + 3]
2.1.3数字键可以不加引号,因为会自动转成字符串。注意,数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符

var obj = {
0.7: "Hello World"
};

obj["0.7"] // "Hello World"
obj[0.7] // "Hello World"

2.2属性的赋值
2.3属性的查看
查看一个对象本身的所有属性,可以使用Object.keys方法。
不可遍历不可遍历的

2.4属性的删除:delete 命令

返回真假
删除一个不存在的属性,delete不报错,而且返回true
删除一个construct不可的为假

delete命令只能删除对象本身的属性,无法删除继承的属性(关于继承参见《面向对象编程》章节)。

var obj = {};
delete obj.toString // true
obj.toString // function toString() { [native code] }
2.5属性是否存在:in 运算符
可以继承的无关遍历 在不在而已
这时,可以使用对象的hasOwnProperty方法判断一下,是否为对象自身的属性。

var obj = {};
if ("toString" in obj) {
console.log(obj.hasOwnProperty("toString")) // false
}

2.6属性的遍历:for...in 循环

跳过不可遍历 可以继承

举例来说,对象都继承了toString属性,但是for...in循环不会遍历到这个属性。

var obj = {};

// toString 属性是存在的
obj.toString // toString() { [native code] }

for (var p in obj) {
console.log(p);
} // 没有任何输出
上面代码中,对象obj继承了toString属性,该属性不会被for...in循环遍历到,因为它默认是“不可遍历”的

如果继承的属性是可遍历的,那么就会被for...in循环遍历到。但是,一般情况下,都是只想遍历对象自身的属性,所以使用for...in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。

var person = { name: "老张" };

for (var key in person) {
if (person.hasOwnProperty(key)) {

console.log(key);

}
}
// name

3.with 语句
里面必须是已有的属性,否则为全局变量
with (对象) {
语句;
}
它的作用是操作同一个对象的多个属性时,提供一些书写的方便

// 例一
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;

// 例二
with (document.links[0]){
console.log(href);
console.log(title);
console.log(style);
}
// 等同于
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style

var obj = {};
with (obj) {
p1 = 4;
p2 = 5;
}

obj.p1 // undefined
p1 // 4

一个很大的弊病,就是绑定对象不明确,只能运营时判断,拖慢运行速度

不要使用with语句,可以考虑用一个临时变量代替with。

with(obj1.obj2.obj3) {
console.log(p1 + p2);
}

// 可以写成
var temp = obj1.obj2.obj3;
console.log(temp.p1 + temp.p2);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106013.html

相关文章

  • JS中数据类型、内置对象、包装类型对象、typeof关系

    摘要:平时在复习基础知识时,经常会遇到数据类型基础数据类型内置对象包装类型对象,检测数据类型时,用到的值,感觉都差不多,但是又有差异。值与数据类型关系对比下图,即可知值相较于基础数据类型少多 平时在复习JS基础知识时,经常会遇到JS数据类型、基础数据类型、内置对象、包装类型对象,检测数据类型时,用到的typeof值,感觉都差不多,但是又有差异。今天特地整理下,方便理解。 JS数据类型 基础数...

    OldPanda 评论0 收藏0
  • 细数判断数据类型的各种方法

    摘要:可用于判断多种数据类型基本数据类型和内置对象,然而对于一些自定义构造函数生成的对象就不能进行判断了。判断是不是所有数据类型中,只有不等于它本身判断数组的方法除了上文提到的三种方法可判断外,还有一个构造函数自带的方法可判断。 数据类型的分类 要想判断数据类型,首先要知道数据类型的分类。数据类型分为基本数据类型和引用数据类型。 基本数据类型 基本数据类型有 五 种,ES6中新加了第 六 种...

    hoohack 评论0 收藏0
  • JS的{} + {}与{} + []的结果是什么?

    摘要:对于与的设计在中所设计的纯对象类型的与方法,它们的返回如下方法返回值对象本身。与三个强制转换函数,所对应的就是在标准中的三个内部运算转换的对照表。 在JS中的运算符共同的情况中,(+)符号是很常见的一种,它有以下的使用情况: 数字的加法运算,二元运算 字符串的连接运算,二元运算,最高优先 正号,一元运算,可延伸为强制转换其他类型的运算元为数字类型 当然,如果考虑多个符号一起使用时,...

    2json 评论0 收藏0
  • javaScript中简单数据类型和复杂数据类型赋值拷贝的理解

    摘要:原理中的数据类型分为两类,简单数据类型和复杂数据类型简单数据类型包括数值,字符串布尔值复杂数据类型对象即属性的集合先了解数据类型在计算机中的存储简单数据类型存储的是对象的原始数据复杂数据类型对象的原型也是引用类型,对象类型的值单独存放。 在js中将一个值a赋值给另一个值b,在什么情况下改变了b的值会影响a的值?在知道哪种类型赋值后改变值会影响原对象的情况下该怎么做才不会影响原对象?就是...

    Julylovin 评论0 收藏0
  • java学习笔记 —— 自动转换与强制转换

    摘要:引用数据类型转换由的继承和向上转型,子类可以很自然地转换为父类对象,即父类类型可以直接引用子类对象,但是子类类型不能直接引用父类对象,需要进行强制转换。但是将功能较弱的类型父类强制转功能较强的对象子类时,就不一定可以行了。 1、引用数据类型转换: 由java的继承和向上转型,子类可以很自然地转换为父类对象,即父类类型可以直接引用子类对象,但是子类类型不能直接引用父类对象,需要进行强制转...

    AlienZHOU 评论0 收藏0
  • 《Java编程思想》读书笔记-类与对象

    摘要:类最基本的作用,在于通过类获取到相应的对象,在向对象发送消息时以期望对象做某些特定的事情。先导概念引用中一切皆对象,因此采用一个指向对象的引用来操纵对象。对象可以存活于作用域之外。 欢迎各位读者关注我的微信公众号,共同探讨Java相关技术。生命不止,学习不休! showImg(https://segmentfault.com/img/bVboaBO?w=129&h=129); 也许你慢...

    NickZhou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<