# 一共7中数据类型
+ null[typeof为object] var a = null;
+ undefined[typeof为undefined] 未定义
+ number 1
+ string “1” //string 也是基础类型
+ 引用类型 (object、array、function)
+ Symbol
# 引用类型 (object、array、function)
+object {“name”:”jack”,”age”:12}
+array 数组也是object,array[typeof为object] [1,2,3]
+function
是function,不是object
判断类型有以下4种判读方法
第一种方式: typeof
typeof null ---> "object"
typeof undefined ---> "undefined"
typeof true | false ---> 'boolean'
typeof 42 ---> 'number'
typeof "42" ---> 'string'
typeof { name : '1'} | [] ---> 'object'
typeof Symbol ---> 'symbol'
typeof ()=>{} ---> 'function'
typeif void 0 ---> 'undefined'
第二种方式 instanceof 但是这种方式只适合判断object类型
比如 : var arr = [] ; arr instanceof Array ---> true
arr instanceof Object --> true
null instanceof Object ---> false //虽然typeof为object,单null不是Ojbect的实例
[function] instanceof Object | Function --> true
第三种方式 Object.prototype.toString.call() 这种方式可以将全部的数据类型检测出来 也是 推荐的方式
因为toString是Object的原型方法, 而 Array Function 等都是Object的实例。都重写了toString 方法。返回的是类型的字符串
Object.prototype.toString.call(null) ---> [object Null]
Object.prototupe.toString.call(undefined) ---> [object Undefined]
Object.prototype.toString.call(123) ---> [object Number]
Object.prototype.toString.call(true) ---> [object Boolean]
Object.prototype.toString.call('123') ---> [object String]
Object.prototype.toString.call({}) ---> [object Object]
Object.prototype.toString.call([]) ---> [object Array]
Object.prototype.toString.call(Math) ---> [object Math]
Object.prototype.toString.call(function(){}) ---> [object Function]
Objdec.prototype.toString.call(new Date) ---> [object Date]
Object.prototype.toString.call(Symbol()) ---> [object Symbol]
js中所有的基础类型都是不可变的。基础类型是值类型,object是引用类型。
var s = "abc";
s.length = 100;
s.length;//依然是3
基础类型调用函数或者属性时,是先将通过s产生为一个新对象,操作都是在这个对象上进行的。不影响原有数据s。
全局变量默认所属的对象是window,如
var name = "jack";
window.name = "jack";
undefined与null比较
2者参与计算都是false
undefined不是对象,null是对象
null===undefined //false
null==undefined //true
NaN
NaN不等于任何一个数字,虽然其本身确实是个数字。所以有Nan==NaN为false,NaN === NaN 为false
isNaN一般用来判断影式转换后是否为数字:
isNaN(3) = false;
isNaN("34") = false;
isNaN({}) = true;
isNaN("ab4") = true;
isNaN("123BB") = true;
isNaN(NaN) = true;
所以一般可以用isNaN来判断一个输入是不是数字。
跟Number.isNaN的区别是,Number.isNaN不做转换,而是直接看是不是NaN,只有NaN才返回true,其他均为false
Number.isNaN(3) = false;
Number.isNaN("34") = false;
Number.isNaN({}) = false;
Number.isNaN("ab4") = false;
Number.isNaN("123BB") = false;
Number.isNaN(NaN)=true;
NaN跟任何数做算术都是NaN
NaN+3= NaN
NaN+NaN = NaN
NaN-NaN = NaN
0/0 = NaN
1/0 = Infinity
定义一个类,并定义其函数:
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
this.changeName=changeName;
function changeName(name)
{
this.lastname=name;
}
this.__defineGetter__("firstname", function(){
return firstname + "mask2";
});
this.__defineSetter__("firstname", function(val){
firstname = val +"mask1";
});
}
var x = new person("sun","chunjie","28","black");
x.firstname = “dddsg”;
alert(x.firstname);
//字面定义,以下也是定义对象
var p = {
x:0,
y:10,
z:100,
put:function(){},
get x(){//x属性的getter方法
return 0;
}
set x(newX){//x属性的setter方法
this.x = newX;
}
};
以下方法定义的都是对象,用new就是引用类型了。
var carname=new String;
var x= new Number;
var y= new Boolean;
var cars= new Array;
var person= new Object;