JavaScript 系列之类型(一)

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战markdown

1、内置类型

1.1 基本类型

  • Boolean
  • String
  • Number
  • Null
  • Undefined
  • Symbol(ES6 新定义)

1.2 引用类型

  • Object
    • Function
    • Date
    • Array
    • 等等
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

2、类型转换

2.1 转 Boolean

在条件判断时,除了 undefinednullfalseNaN''0-0 会转为 false,其余全部值都转为 true,包括全部对象。post

2.2 对象转基本类型

对象在转换基本类型时,首先会检查有无设置 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'
复制代码

2.3 四则运算

  • -、*、/、% :一概转换成数值后计算
  • +
    • 数字 + 字符串 = 字符串, 运算顺序是从左到右
    • 数字 + 对象, 优先调用对象的 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
复制代码

2.4 相等(==)

相等和不相等 —— 先转换再比较lua

规则:url

  1. 一个是布尔,比较以前先转换成数值 —— false0true1
  2. 一个是字符串,一个是数值 ,比较以前先将字符串转成数值
  3. 一个是对象,另外一个不是,则调用对象的 valueof 方法,用获得的基本类型值按照前面的规则进行比较。

比较时遵循:spa

  1. nullundefined 相等。
  2. 一个是 NaN,另外一个不管是什么,相等操做符都返回 false;繁殖不相等操做符则返回 true
  3. 两个都是对象,则比较是不是同一个对象。若是两个操做数指向同一个对象,即指向同一个引用,则相等操做符返回 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
复制代码

2.5 全等(===)

全等和不全等——仅比较而不转换(除了在比较以前不转换操做数外,全等和不全等与相等和不相等没有什么区别)设计

"55"===55 //false
null===undefined //false
NaN===NaN //false
undefined===undefined //true
null===null //true
复制代码
相关文章
相关标签/搜索