JavaScript六种数据类型
- 隐式转换
+ :当两个变量分别为数字和字符串时,默认为字符串拼接。
- :默认为减法运算
Eg:32+32 ——>64
“32”+32——>”3232”
“32”-”32”——>0
运用技巧:num+”” 可将number类型的num转换为string类型
num-0可将string类型的num转换为number类型
- 数据类型
原始类型:number, string, boolean, null ,undefined, object,
Object中又包括:function,array,Date...
- “等于”
- “1.23”==1.23 :当等号两边一边为字符串一边为数字时,会尝试把字符串转换为数字, 再进行比较。
- 0==false
- 一边是boolean一边是数字,会先把boolean转换成数字再做比较。1==true——>true
- object==number|string尝试将对象转换为基本类型(方法后面会讲,包装类)再比较 new String(‘hi’)==’hi’——>true
- Null==undefined
- new Object()==new Object()
- [1,2]==[1,2]
- “严格等于”
- a===b :首先会判断等号左右两边的类型,如果类型不同,则返回false。
- null===null
- undefined===undefined
- NaN===NaN——>false
- new Object()===new Object()——>false不是两个完全相同的对象
- [1,2]===[1,2]——>false 不是两个完全相同的对象
- JaaScript包装对象
String是一个字符串类型,而new string()则是一个对象类型,在对string类型的字符串做.length操作时,可以获取其长度,在对string类型的字符串设置属性时,也不会报错,原因是在对字符串类型的变量做这些操作时,会将当前字符串转换为一个object类型的变量,并设置相应属性,而当属性设置完毕,这个临时变量就会消失,因此再次调用这个变量时,会得到undefined的结果。(将一个基本类型的变量按照对象的方式去使用时,将该变量转换为包装类型的临时对象,完成访问之后即刻销毁。)
- JaaScript类型检测
- typeof():多用于判断基本类型或函数对象,返回值是一个字符串(“string”,”number”,”boolean”,”undefined”...)记住typeof(null)===”object”
- Instanceof 多用于判断对象的类型,专门根据原型链判断类型。
对象 instanceof 函数对象或函数构造器 如果右边类型不符的话就会抛出
typeerror异常,(判断左边的左操作数对象的原型链上,是否有右边这个构造
prototype属性)
Eg: [1,2] instanceof Array===true
New Object() instanceof Array===false
- Object.prototype.toString()
Eg: Object.prototype.toString.apply([])===”[object Array]”
Object.prototype.toString.apply(function(){})===”[object Fuction]”
- 判断两个数组是否相等,可将两个数组的toString()相比较。
JavaScript表达式
- 逗号表达式,一次从左到右计算表达式,最后结果取最右边的:
var val=(1,2,3) // val=3
- num=’12’
num=+num
num=12
+num可以把字符串转换为数字
- delete运算符:操作对象,可通过configurable 控制对象中的元素是否可被删除
var obj={x:1}; delete obj.x; obj.x//undefined
- 运算符in:判断一个对象中是否有某个属性
JavaScript语句
- try catch语句:try后面必须跟着一个catch或finally
try(){
//正常语句
throw new Error(“opps”)
}catch(ex){
//发生异常捕获,并执行的语句,若没有发生异常,此段代码会被忽略掉
}finally{
//不管有没有发生异常,该语句都会执行
}
Eg1:
当try后面没有catch时,会跳到外层执行距离最近的catch里面语句,但是在这之前,需要先执行当前try语句后的finally语句,因此最终执行结果如上图。
Eg2:
Eg3:
当catch内部再一次抛出异常时,会先执行当前同级的finally语句,再将catch中抛出的异常抛到下一层catch语句中执行。
- Switch语句:
- 严格模式
JavaScript对象
- 属性标签
- value:属性的值
- writable:当前属性是否可写。
- enumerable:当前属性时否可遍历(可枚举)。在for in时是否会被遍历出来。
- configurable:属性标签是否可以被修改,当前属性是否可以被delete。
- 序列化
1、JSON.stringify中注意的问题(json.stringify叫做“序列化”)
当对象中的属性的值为undefined时,在json.stringify后的结果中不会出现该项属性。
- 反向对应为JSON.parse()
- 自定义序列化,在需要处理的对象属性内部定义一个方法属性toJSON,在函数内部做处理,此时的this指的是当前被操作的属性。
JavaScript数组
1、数组的长度最大为2的23次方-1
- 在数组的第一位添加元素的方法为arr.unshift(添加的元素)
- delete arr[2]是把数组的下标为2的元素置为undefined,该元素的位置仍然在。
- arr.pop()删除数组的最后一个元素
- arr.shift()删除数组的第一个元素
- 判断一个数组中是否存在某个索引用,num in arr,返回值为true/false,其中num 为索引值,当索引位置的元素为undefined时,会返回false
- 数组的操作
(1)join():将数组转换为字符串,join的参数为数组间元素的分隔符。
(2)reverse():数组逆序。(原数组被修改)
(3)sort():排序。(按照转换为字符串排序,当数组中元素为数字,且为两位以上事,需要借助函数排序)
eg:arr.sort(function(a,b){return a-b})(由小到大排序,原数组被修改)
- concat():数组合并,原数组未被修改。
特殊:var arr=[1,2,3]
arr.concat([4,5,[6,7]])
结果:[1,2,3,4,5,[6,7]]
arr.concat([10,11],13)
结果:[1,2,3,10,11,13]
会将concat的元素的中括号打开一层再concat进去。
(5)slice():返回部分数组,(原数组不会被修改)两个参数,第一个参数,起始位置,第二个参数,终止位置,包前不包后,当没有第二个参数时,默认到结尾。
(6)splice(a,b):删除数组的一部分(会改变原数组)。a:要删除元素的起始下标(包含),b:要删除元素的个数。返回值为被删除的数组片段。
(7)arr.forEach():
- arr.map()遍历数组
- arr.filter():
- arr.every():判断数组中每一个元素都满足某个条件。arr.some()判断数组中是否存在某个元素满足某个条件。返回true/false。
- arr.reduce():将数组中的元素进行两两操作。
其中的0,是第一次传入的时候,第一次的x的值。再把第一次得到的结果当成下一次的X传进去。
- arr.reduceRight():用法和上面一致,但是执行时从右向左执行数组中的元素。
- arr.indexOf(元素,起始下标):查找元素的位置,返回元素的下标。若未找到,则返回-1。
- arr.lastIndexOf(元素,起始下标):元素最后一次出现的位置。
- 判断一个变量是否为数组:
Array.isArray(被判断变量); // true/false
JavaScript函数
- 函数声明与表达式
函数声明会被提前,而函数表达式不会。
- this
对象原型链上的this:对象o在p的原型链上p是{},但原型链上存在prop属性
如果函数返回的是一个对象时,此时通过new出来的对象中的this为return回的对象。
call,apply,bind:改变this的指向,区别是传参形式不同。
- 函数属性arguments
- arguments为函数的参数数组,当函数被调用传入参数时,arguments被赋值,此时arguments为被传入的参数,但在函数内部可对arguments进行赋值,此时arguments会被改写,改写的结果会影响函数的结果,但若在传参时并没有给对应的参数赋值,则在函数内部对未被传参的参数赋值是无效的,还是会返回undefined。
- arguments.callee===当前函数名。多用于递归函数,使函数不用受到名称的限制,通过arguments.callee即可调用本身。
- call、apply、bind的第一个参数为this的指向,是个对象,若不是对象则会被转成对象。若this被指向null或undefined,则默认this会指向全局对象window(对于浏览器是window,对于nodejs就是global对象)。(若是在严格模式下,this传入什么就是什么,也不会转换成对象了)
- bind与currying
1、适用场景:当函数中某几个参数是固定的,但其他参数是在改变的,可以用bind先将其他参数固定,再只给其他参数传值。
2、当使用new时,若return回来的不是对象,则会return this,且此时this会被初始化为一个空对象,他的原型是foo.prototype,虽然此时使用了bind改变了this的指向,但是由于使用new,所以this还是指向一个空对象,由于设置了this属性b,因此会返回一个带有属性b的对象。
JavaScript理解闭包、作用域
JavaScript OOP(面向对象编程)
- 改变prototype
当一个对象实例化之后,去改变它的原型对象,不会影响当前实例的属性,但是会影响后续创建的实例。Bosn是student的实例。