js数据类型
js定义了6种数据类型,数值、字符串、布尔值称为原始数据类型的值即基本数据类型。
将对象称为复杂类型的值,对象又可以细分为狭义的对象、数组、函数、正则表达式。因为一个对象往往是多个原始类型的值的合成,可以看做是一个存放各种值的容器。
至于undefined和null,一般将他们看成两个特殊值。
数值(number):整数和小数
字符串(string):字符组成的文本
布尔值(boolean):true和false
undefined:未定义或不存在,即此处目前没有任何值。
null: 空缺,即此处应该有一个值但目前为空
对象: 各种值组成的集合。
基本数据类型和引用类型的区别:
基本数据类型
- 基本数据类型的值是不可变的
var name="hello";
name.substr(2);//此处sunstr方法返回新的字符串
console.log(name);//"hello"
- 基本数据类型不可以添加属性和方法
- 基本数据类型是简单的赋值
- 基本数据类型是值的比较
var a="{}";
var b="{}";
console.log(a==b);//这里是字符串的比较,所以返回的是true。
- 基本数据类型存放在栈中,栈里存放的是一个字典,左侧是key(变量名),右侧是value(真正的值)
引用类型 - 值是可以改变的
var o={x:1};
o.x=2;//console.log(o.x)已经变成2了。
- 可以添加属性和方法
- 引用类型赋值的是对象的引用
var a={};
var b=a;//b在栈中新建了一个地址,指向了a在堆中存储的数据
a.name="change";//a的更改影响b的数值
console.log(a.name);//change
console.log(b.name);//change
- 引用类型比较的是引用地址
var a={};
var b={};
console.log(a==b);//这里返回的是false。
- 引用类型数据会保存在栈和堆中
var a={name:"zs"}
栈中保存的是a和一个分配的地址,堆中保存的是'{name:"zs"}'
typeof和instanceof的作用和区别
typeof 用以获取一个变量的类型,typeof一般只能返回如下几个结果: number ,boolean ,string, function, object, undefined,我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){}
,而不用去使用if(a)因为如果a 不存在(未声明)就会出错,对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性。
如果我们希望获取一个对象是否是数组,或判断某个变量是否是某个对象的实例则要选择使用instanceof。instanceof用于判断一个变量是否是某个对象的实例,例如var a=new Array();alert (a instanceof Array);
会返回true;同时alert(a instanceof object)
也会返回true,这是因为Array是object的子类。再如function test (){};var new test();alert(a instanceof test)
会返回true。
判断一个变量是否是数字、字符串、布尔、函数
typeof
typeof返回6种数据类型,但是对于所有的对象都返回object,不能返回自定义的数据类型。比如,date,regexp,array,domelement的类型都是object,另外,typeof null是object。
instanceof
instanceof适用于任何object类型的检查。
function animal(){
(new animal) instanceof animal //直接原型关系返回true
}
function cat(){}
cat.prototype=new animal
(new cat) instanceof animal // 原型链上的间接原型
instanceof也可以用于检测实例比如 array, regexp,object, function。这一点可以区分数组和对象
[1,2,3]instanceof array //true
/abc/ instanceof RegExp //true
var o={};
var a=[];
o instanceof Array//false,o不是Array的实例
a instanceof Array//true,instanceof判断是否是数组实例
instanceof 对基本数据类型不起作用,但是可以这样:
new Number(3) instanceof Number // true
但这时你已经知道数据类型了,类型检查已经没有用了。
toString
toString方法是最为可靠的类型检测手段,它会将当前的对象转为字符并输出。toString属性定义在object.prototype上。因而所有的对象都有toString
方法。但array,date等对象会重写object.prototype继承来的toString,所以最好用Object.protoytpe.toString来检测类型。
toString=Object.prototype.toString;
toString.call(3)//[Object Number]
toString适用于ecma的内置js类型(包括基本数据类型和对象)但是不能判断自定义的数据类型。
NaN
即非数值是一个特殊的数值。
parseInt('abc')//NaN
任何数值除以非数值会返回NaN;
任何涉及NaN的操作都会返回NaN;
NaN与任何值都不相等,包括NaN本身。
非数值转化为数值
- number()函数,不常用
- paseInt()
转换规律
- 忽略字符串前面的空白字符,找到第一个非空白字符
- 如果第一个字符不是-或者数字则返回NaN
- 如果是,继续解析,直到非数值模式为止
- 0开头会当做八进制,0X开头会当做十六进制,可以指定第二个参数指定基数
parseInt('101' ,2)
,其中2就是二进制。
- paseFloat()
paseFloat('3.4')//3.4
布尔类型
==与===的区别
==是近似相等,使用==的时候,js会帮助我们做类型的转化然后再比较值,造成一些匪夷所思的结果,那么使用==的时候会在哪些情况下做类型的转换,又会转换成什么样子
- 如果两个值得类型相同,则执行严格相等的运算。
- 如果两个值得类型不同:
- 如果一个是null,一个是undefined那么相等。
- 如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
- 如果一个值是true/false,则将其转为1/0比较
- 如果一个值是对象,一个是数字或字符串,则尝试使用valueof和toString 转换后比较。
- 其他的就不相等了。
===是绝对相等:数据类型一样再比较值,用此做判断最严谨。
转换为false的类型
如果js预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值,转换规则是除了下面六个值被转换为false其他值都视为true。undefined,null,false,0,nan,""(不能为空格,空字符串)
if(undefined){console.log('ok')}//undefined
if(!undefined){console.log('ok')}//ok
空对象和空数组的转换
[]和{}对应的布尔值都是true。
Number
js的数字类型和其他语言有所 不同,没有整型和浮点数的区别,统一都是Number,可以表示十进制、八进制、十六进制。
浮点数
浮点数是指数字包含小数点、小数点后至少有一位数字(没有或是会转换 为整数),前面可以没有。
var a=3.1e5
var b=.45
对于极大或者极小的数字可以使用科学计数法
var a=3.1e5//310000
浮点数最高精度是17位,但在计算的时候精度不如整数所以在做小数运算时不要做判断
1-0.9;//0.099999...8
a=0.1,b=0.2
if(a+b==='0.3'){
console.log('ok')//undefined
}
整数有最大值、最小值限制,当超过范围后就不精确了。
Infinity表示无穷大,也是number类型。1/0。
string
可以用单引号或者双引号表示。
object
对象就是一种无序的数据集合,由若干个 ‘键值对’(key-value)构成,key我们通常称为对象的属性,value可以是任何js类型,甚至可以是对象。
属性的读取
object的属性读取有两种方式
obj.name
obj['name']
null和undefined
null和undefined都可以表示“没有”,含义非常相似,将一个变量赋值为‘undefined’和null的效果非常相似。
var a=undefined//直接写var hello打印hello就会出现undefined
var a=null//但是对于null必须赋值为null,var world=null,打印world
在if语句中,它们都会被自动转换为false,相等运算符(‘==’)甚至报告两者相等。
if(!undefind){
console.log('undefined is false')
}
if(!null){
console.log('null is false')
}
undefined==null//true
Number(null)//0
Number(undefined)//NaN
null表示空值:var a=null(声明变量为空)
用法:作为函数的参数,表示该函数的参数是一个没有任何内容的对象。
undefined:表示不存在值,就是此处目前不存在任何值。
用法:变量被声明了,但没有赋值时,等于undefined.调用函数时,应该提供的参数没有提供,该参数等于undefined,对象没有赋值的属性,该属性的值为undefined,函数没有返回值时,默认返回undefined.
var i//undefined 没有赋值
function f(x){
console.log(x)//f();undefined 没有return
}
var o=new object()
o.p//undefined 声明对象,调用对象属性。
var x=f();//x undefined
#break与continue的区别
break是退出循环,而continue是跳过本次循环执行下次循环
for(var i=1;i<10;i++){
if(i%4===0){
break;
}
console.log(i);
}
i:1/2/3
for(var i=1;i<10;i++){
if(i%4===0){
break;
}
console.log(i);
}i:1/2/3/5/6/7/9
#void 0与undefined的区别
viod作用是执行一个表达式,返回undefined
例如:
function fn(){
var undefined=3;
var a;
if(a===undefined){
console.log("===")
}else{
console.log("!==")
}
}
fn()
上述做法是错误的当把undefined赋值了,就不能做判断了,方法就是a===void 0
#代码
1. console.log(1+1)输出结果是2
原因:两个操作数是数字,会做加法运算。
console.log("2"+"4")输出结果是“24“
原因:两个参数是字符串,会做字符串拼接
console.log(2+"4")输出结果是”24“
原因: 有一个参数是字符串,会做字符串拼接
console.log(+"4")输出结果是4
原因: 在只有一个字符串参数的时候,会尝试将其转换成数字
2.
var a=1;
a+++a;//输出结果是3,理解为(a++)+a,因为++的优先级高于+,所以等同于1+2=3。
typeof a+2//输出结果是“number2”typeof的优先级高于+,所以typeof a是number字符串,字符串与数字相加为拼接字符串。
3.
var a=1;
var b=3;
console.log(a+++b);//输出结果是4,++的优先级较高,所以先运算,等同于(a++)+b=1+3=4
4. 遍历数组,把打印数组每一项的平方
var arr=[3,4,5]
for(i=0;i<arr.length;i++){
console.log(arr[i]*arr[i]);
}
5. 遍历json,打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for( var key in obj){
console.log(obj[key]);
}
6.
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) //输出结果是“number2”因为typeof的权重高,typeofa输出是number,字符串与数字相加是字符串拼接。
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)//输出结果是bb和undefined;先运算console.log('bb')输出bb,然后进行判断d==5(true),console.log('bb')无法转换成布尔值,所以输出undefined。
var data2 = d = 0 || console.log('haha')
console.log(data2)//输出结果是haha和undefined;先运算console.log('haha')输出haha,然后进行“||”,因为0的布尔值是false,console.log('haha')无法转换成布尔值,最后data2的值为undefined。
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)//输出结果是2。!!"Hello"的结果为true,(!"world", !!"from here!!") 逗号运算符用于对两个表达式求值,并返回后一个表达式的值,!!"from here!!"的结果为true,因此(!"world", !!"from here!!")返回true,所以var x = true + true。当数字和布尔值或布尔值与布尔值进行+、-、*、/操作时,会将布尔值转换为数字,true转换为1,false转换为0。所以var x = true + true转换为var x = 1 + 1,因此最终结果为2