JavaScript深入浅出学习笔记

JavaScript六种数据类型

  1. 隐式转换

 

+  :当两个变量分别为数字和字符串时,默认为字符串拼接。

-  :默认为减法运算

 

 

Eg:32+32 ——>64

“32”+32——>”3232”

“32”-”32”——>0

 

运用技巧:num+”” 可将number类型的num转换为string类型

  num-0可将string类型的num转换为number类型

 

  1. 数据类型

 

原始类型:number, string, boolean, null ,undefined, object,

 

Object中又包括:function,array,Date...

 

  1. 等于
  1. “1.23”==1.23 :当等号两边一边为字符串一边为数字时,会尝试把字符串转换为数字,  再进行比较。
  2. 0==false
  3. 一边是boolean一边是数字,会先把boolean转换成数字再做比较。1==true——>true
  4. object==number|string尝试将对象转换为基本类型(方法后面会讲,包装类)再比较 new String(‘hi’)==’hi’——>true
  5. Null==undefined
  6. new Object()==new Object()
  7. [1,2]==[1,2]

 

  1. 严格等于
  1. a===b :首先会判断等号左右两边的类型,如果类型不同,则返回false。
  2. null===null
  3. undefined===undefined
  4. NaN===NaN——>false
  5. new Object()===new Object()——>false不是两个完全相同的对象
  6. [1,2]===[1,2]——>false 不是两个完全相同的对象

 

 

 

 

 

  1. JaaScript包装对象

 

String是一个字符串类型,而new string()则是一个对象类型,在对string类型的字符串做.length操作时,可以获取其长度,在对string类型的字符串设置属性时,也不会报错,原因是在对字符串类型的变量做这些操作时,会将当前字符串转换为一个object类型的变量,并设置相应属性,而当属性设置完毕,这个临时变量就会消失,因此再次调用这个变量时,会得到undefined的结果。(将一个基本类型的变量按照对象的方式去使用时,将该变量转换为包装类型的临时对象,完成访问之后即刻销毁。

 

  1. JaaScript类型检测
  1. typeof():多用于判断基本类型或函数对象,返回值是一个字符串(“string”,”number”,”boolean”,”undefined”...)记住typeof(null)===object
  2. Instanceof 多用于判断对象的类型,专门根据原型链判断类型。

对象 instanceof 函数对象或函数构造器   如果右边类型不符的话就会抛出

typeerror异常,(判断左边的左操作数对象的原型链上,是否有右边这个构造

prototype属性)

Eg:  [1,2] instanceof Array===true

     New Object() instanceof Array===false

  1. Object.prototype.toString()

Eg: Object.prototype.toString.apply([])===”[object Array]”

   Object.prototype.toString.apply(function(){})===”[object Fuction]”

 

 

  1. 判断两个数组是否相等,可将两个数组的toString()相比较。

 

 

 

 

 

 

 

 

JavaScript表达式

  1. 逗号表达式,一次从左到右计算表达式,最后结果取最右边的:

var val=(1,2,3) // val=3

  1. num=’12’

num=+num

num=12

+num可以把字符串转换为数字

  1. delete运算符:操作对象,可通过configurable  控制对象中的元素是否可被删除

var obj={x:1};    delete obj.x;     obj.x//undefined

  1.  运算符in:判断一个对象中是否有某个属性

 

 

 

JavaScript语句

  1. 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语句中执行。

 

 

  1. Switch语句:

  1. 严格模式

JavaScript对象

  1. 属性标签
  1. value:属性的值
  2. writable:当前属性是否可写。
  3. enumerable:当前属性时否可遍历(可枚举)。在for in时是否会被遍历出来。
  4. configurable:属性标签是否可以被修改,当前属性是否可以被delete。

 

 

  1. 序列化

 

1、JSON.stringify中注意的问题(json.stringify叫做“序列化”

当对象中的属性的值为undefined时,在json.stringify后的结果中不会出现该项属性。

  1. 反向对应为JSON.parse()
  2. 自定义序列化,在需要处理的对象属性内部定义一个方法属性toJSON,在函数内部做处理,此时的this指的是当前被操作的属性。

 

JavaScript数组

1、数组的长度最大为2的23次方-1

  1. 在数组的第一位添加元素的方法为arr.unshift(添加的元素)
  2. delete arr[2]是把数组的下标为2的元素置为undefined,该元素的位置仍然在。
  3. arr.pop()删除数组的最后一个元素
  4. arr.shift()删除数组的第一个元素
  5. 判断一个数组中是否存在某个索引用,num in arr,返回值为true/false,其中num                     为索引值,当索引位置的元素为undefined时,会返回false
  6. 数组的操作

(1)join():将数组转换为字符串,join的参数为数组间元素的分隔符。

(2)reverse():数组逆序。(原数组被修改)

(3)sort():排序。(按照转换为字符串排序,当数组中元素为数字,且为两位以上事,需要借助函数排序)

eg:arr.sort(function(a,b){return a-b})(由小到大排序,原数组被修改)

  1. 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():

 

 

 

  1. arr.map()遍历数组

  1. arr.filter():

      

  1. arr.every():判断数组中每一个元素都满足某个条件。arr.some()判断数组中是否存在某个元素满足某个条件。返回true/false。

  1. arr.reduce():将数组中的元素进行两两操作。

其中的0,是第一次传入的时候,第一次的x的值。再把第一次得到的结果当成下一次的X传进去。

  1. arr.reduceRight():用法和上面一致,但是执行时从右向左执行数组中的元素。
  2. arr.indexOf(元素,起始下标):查找元素的位置,返回元素的下标。若未找到,则返回-1。
  3. arr.lastIndexOf(元素,起始下标):元素最后一次出现的位置。
  4. 判断一个变量是否为数组:

Array.isArray(被判断变量); // true/false

 

 

JavaScript函数

  1. 函数声明与表达式

函数声明会被提前,而函数表达式不会。

  1. this

对象原型链上的this:对象o在p的原型链上p是{},但原型链上存在prop属性

 

如果函数返回的是一个对象时,此时通过new出来的对象中的this为return回的对象。

call,apply,bind:改变this的指向,区别是传参形式不同。

 

 

  1. 函数属性arguments
  1. arguments为函数的参数数组,当函数被调用传入参数时,arguments被赋值,此时arguments为被传入的参数,但在函数内部可对arguments进行赋值,此时arguments会被改写,改写的结果会影响函数的结果,但若在传参时并没有给对应的参数赋值,则在函数内部对未被传参的参数赋值是无效的,还是会返回undefined。

 

 

  1. arguments.callee===当前函数名。多用于递归函数,使函数不用受到名称的限制,通过arguments.callee即可调用本身。
  2. call、apply、bind的第一个参数为this的指向,是个对象,若不是对象则会被转成对象。若this被指向null或undefined,则默认this会指向全局对象window(对于浏览器是window,对于nodejs就是global对象)。(若是在严格模式下,this传入什么就是什么,也不会转换成对象了)

  1. bind与currying

1、适用场景:当函数中某几个参数是固定的,但其他参数是在改变的,可以用bind先将其他参数固定,再只给其他参数传值。

2、当使用new时,若return回来的不是对象,则会return this,且此时this会被初始化为一个空对象,他的原型是foo.prototype,虽然此时使用了bind改变了this的指向,但是由于使用new,所以this还是指向一个空对象,由于设置了this属性b,因此会返回一个带有属性b的对象。

JavaScript理解闭包、作用域

JavaScript OOP(面向对象编程)

  1. 改变prototype

当一个对象实例化之后,去改变它的原型对象,不会影响当前实例的属性,但是会影响后续创建的实例。Bosn是student的实例。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章