一、JavaScript里有哪些数据类型,解释清楚null 和undefined,解释清楚原始数据类型和引用数据类型。比如讲一下1 和Number(1)的区别
数据类型:
undefined,没有定义数据类型
number,数值数据类型,例如10或者1或者5.5
string,字符串数据类型,例如”helloworld”
boolean,布尔类型true|false
object,对象类型,复杂的一组描述信息的集合
null和undefined的区别:
1、null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。Null表示“没有对象”,即该处不应该有值。典型的用法是:
(1)作为函数的参数,表示该函数的参数不是对象
(2)作为对象原型链的终点。
2、当声明的变量还未被初始化时,变量的默认值为undefined
undefined表示“缺少值”,就是此处应该有一个值,但是还没有定义。
(1) 变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数就等于undefined
(3) 对象没有赋值的属性,该属性的值为undefined
(4) 函数没有返回值时,默认返回undefined
原始数据类型(基本数据类型)、引用数据类型:
1、 ECMAScript变量包含两种不同类型的值:基本类型值、引用类型值。
2、 基本类型值:指的是保存在栈内存中的简单数据段。
3、 引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值。
两种访问方式
4、 基本类型值:按值访问,操作的是他们实际保存的值
5、 引用类型值:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再找到保存在堆内存中的值。
两种类型复制
基本类型变量的复制:从一个变量向另一个复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上。
引用类型变量的复制:复制的是存储在栈中的指针,将指针复制到栈中为新变量分配的空间中,而这个指针副本和原指针指向存储在堆中的同一个对象,复制操作结束后,两个变量实际上将引用同一个对象,因此改变其中一个,将影响另一个。
函数参数的传递
1、ECMA中所有函数的参数都是按值传递的;
function setName(obj) {
obj.name = "1111";
obj = new Object();
obj.name= "2222";
}
var person = newObject();
setName(person);
console.log(person.name);
//输出结果:1111
两种变量类型检测
1、 Typeof操作符是检测基本类型的最佳工具;
2、 如果变量值是null或者对象,typeof将返回“object”;
3、 Instanceof用于检测引用类型,可以检测到具体的、它是什么类型的实例。
4、 如果变量是给定引用类型的实例,instanceof操作符会返回true;
1 和 Number(1)的区别,a与String(“a”)的区别类似
console.log(1 ==Number(1));//true。
1是一个常量,Number(1)是一个函数,把传入的参数转为number类型,比如Number(“ 123 ”);返回值是123(消除前后空格),类型是number,如果传入的参数是Number(“abc”),则返回值是NaN,类型同样是number。
Var a = new Number(1),则a的类型为Object。返回值为[Number:1]