JavaScript中的数据类型

javascript中有三种数据类型
1.基本数据类型
2.包装对象
3.引用类型


基本数据类型

基本数据类型 分为五种基本数据类型

  1. 字符串
  2. 数字
  3. undefined

undefined 就是未定义的意思(变量,参数,返回值...) typeof 返回undefined

  1. null

null是JavaScript的关键字 用来描述空值 typeof返回object 可以认为是一个特殊的对象值 将不再使用的变量赋给null可以释放内存

  1. boolean

null和undefined 非严格运算 ==会认为两值相等


包装对象

一些基本数据类型 却拥有对象的属性跟方法
例如


  1. 'wyx'.length // 3
  2. 'xjh'.indexOf('f') // -1

为什么基本数据类型会有属性与方法?

包装对象是基本数据类型用构造函数创建的结果,所以它们是对象可以拥有属性与方法 基本数据类型是可以使用内置类来转换的,转换后虽然值一样但是 typeof 的结果此时是对象了,如果你用来作判断的话 根据隐式转换很容易弄错

var n1 = 1;
var n2 = new Number(1);
console.log(typeof n2) // object
console.log(n1 instanceof Number, n2 instanceof Number) // false true
var f2 = new Boolean(false);
var f1 = false;
if (f2) {
  console.log('wyx') // 打印
}
if (f1) {
  console.log('wyx1') // 不打印
}

但对于引用数据类型 它们用字面量还是构造函数instanceof内置类都为true

以下从权威指南摘要得

只要引用了字符串'wyx'的属性。JavaScript就会将字符串值通过new String('wyx')的方式转换成对象 这个对象就拥有字符串的方法,并被用来处理属性的引用。一旦属性引用结束这个新创建的对象就会销毁这个临时对象 数字和布尔值一样 undefined和null无包装对象


引用对象

js引擎在变量提升后,运行代码时,遇到变量赋值 会判断赋值如果是基本数据类型值则直接变量值为基本数据类型值,如果为对象,数组,正则函数 则会开辟一个堆内存,然后返回一个地址给这个变量,在执行栈开始时通过地址来操作这个堆内存,
所以指向同一堆内存地址的变量会影响彼此


var xjh = {
  wife: 'wyx',
  time: 'onelife'
}
var b = a;
b.time = 'sanshengsanshi';
console.log(a)
/** 
 * {wife: 'wyx', time: 'sanshengsanshi'}
*/

所以如果要创建两个完全互不影响的对象需要通过深拷贝 ,开辟不同的堆内存,使得它们的引用地址不同
下次再写深拷贝

如果是函数的话只有函数运行时才会运行堆内存的代码形成一个新的运行栈心新的运行作用域

posted @ 2019-01-14 23:47  queenXueli  阅读(111)  评论(0)    收藏  举报