这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战markdown
let obj = {
a: 1,
b: [1, 2, 3],
};
let aa = obj.a;
let bb = obj.b;
aa = 2;
bb.push(4);
console.log(obj);
console.log(aa);
console.log(bb);
// {a: 1, b: [1, 2, 3, 4]}
// 2
// [1, 2, 3, 4]
复制代码
虽然 obj 自己是个引用类型的变量(对象),可是内部的 a 和 b 一个是值类型一个是引用类型,aa 的赋值不会改变 obj.a,可是 bb 的操做却会反映到 obj 对象上。app
JS 中这种设计的缘由是:按值传递的类型,复制一份存入栈内存,这类类型通常不占用太多内存,并且按值传递保证了其访问速度。按共享传递的类型,是复制其引用,而不是整个复制其值(C 语言中的指针),保证过大的对象等不会由于不停复制内容而形成内存的浪费。ide
在条件判断时,除了 undefined
, null
, false
, NaN
, ''
, 0
, -0
会转为 false
,其余全部值都转为 true
,包括全部对象。post
对象在转换基本类型时,首先会检查有无设置 Symbol.toPrimitive
(该方法优先级最高),而后调用 valueOf
,而后调用 toString
。三个方法均可以重写。ui
let a = {
toString() {
return '1';
},
valueOf() {
return 0;
},
[Symbol.toPrimitive]() {
return 2;
}
}
console.log(1 + a) // => 3
console.log('1' + a) // => '12'
复制代码
-、*、/、%
:一概转换成数值后计算+
:
数字 + 字符串 = 字符串
, 运算顺序是从左到右数字 + 对象
, 优先调用对象的 valueOf -> toString
数字 + boolean/null -> 数字
数字 + undefined -> NaN
1 + '1' // '11'
2 * '2' // 4
[1, 2] + [2, 1] // '1,22,1'
// [1, 2].toString() -> '1,2'
// [2, 1].toString() -> '2,1'
// '1,2' + '2,1' = '1,22,1'
'a' + + 'b' // -> "aNaN"
// 由于 + 'b' -> NaN
// 你也许在一些代码中看到过 + '1' -> 1
+undefined // NaN
复制代码
相等和不相等 —— 先转换再比较lua
规则:url
false
转 0
,true
转 1
。valueof
方法,用获得的基本类型值按照前面的规则进行比较。比较时遵循:spa
null
和 undefined
相等。NaN
,另外一个不管是什么,相等操做符都返回 false
;繁殖不相等操做符则返回 true
。true
。不然返回 false
。null==undefined //true
"NaN"==NaN //false
5==NaN //false
NaN==NaN //false
NaN!=NaN //true
false==0 //true
true==1 //true
true==2 //false
undefined==0 //false
null==0 //false
"5"==5 //true
let a = { c: 1 }
let b = { c: 1 }
console.log(a == b) // false
let d = b
console.log(d == b) // true
复制代码
全等和不全等——仅比较而不转换(除了在比较以前不转换操做数外,全等和不全等与相等和不相等没有什么区别)设计
"55"===55 //false
null===undefined //false
NaN===NaN //false
undefined===undefined //true
null===null //true
复制代码