JavaScript数据类型

157 阅读2分钟

原始类型

JavaScript 中原始类型有六种,原始类型既只保存原始值,是没有函数可以调用的。

六种原始类型

  • string
  • number
  • boolean
  • null
  • undefined
  • symbol

为什么说原始类型没有函数可以调用,但'1'.toString()却又可以在浏览器中正确执行?

因为'1'.toString()中的字符串'1'在这个时候会被封装成其对应的字符串对象,以上代码相当于new String('1').toString(),因为new String('1')创建的是一个对象,而这个对象里是存在toString()方法的。

null到底是什么类型

现在很多书籍把null解释成空对象,是一个对象类型。然而在早期JavaScript的版本中使用的是32位系统,考虑性能问题,使用低位存储变量的类型信息,000开头代表对象,而null就代表全零,所以将它错误的判断成Object,虽然后期内部判断代码已经改变,但null类型为object的判断却保留了下来,至于null具体是什么类型,属于仁者见仁智者见智,你说它是一个bug也好,说它是空对象,是对象类型也能理解的通。

对象类型

在 JavaScript 中,除了原始类型,其他的都是对象类型,对象类型存储的是地址,而原始类型存储的是值。

var a = [];
var b = a;
a.push(1);
console.log(b); // 输出[1]

在以上代码中,创建了一个对象类型a(数组),再把a的地址赋值给了变量b,最后改变a的值,打印b时,b的值也同步发生了改变,因为它们在内存中使用的是同一个地址,改变其中任何一变量的值,都会影响到其他变量。

\

\

对象当做函数参数

function testPerson(person) {
  person.age = 52;
  person = {
    name: '李四',
    age: 18
  }
  return person;
}
var p1 = {
  name: '张三',
  age: 23
}
var p2 = testPerson(p1);
console.log(p1.age);  // 输出52
console.log(p2.age);  // 输出18

代码分析

  1. testPerson函数中,person传递的是对象p1的指针副本
  2. 在函数内部,改变person的属性,会同步反映到对象p1上,p1对象中的age属性发生了改变,即值为52
  3. testPerson函数又返回了一个新的对象,这个对象此时和参数person没有任何关系,因为它分配了一个新的内存地址
  4. 以上分析可以用如下图表示

如若转载,请注明出处:开源字节   sourcebyte.cn/article/123…