js小知识点梳理(1)

typeof

typeof undefined//undefined  
typeof b // undefined
typeof null//object  
typeof string//string  
typeof number//number  
typeof NaN//number  NaN 也属于 number 类型,并且 NaN 不等于自身。
typeof boolean//boolean  
typeof function//function  
typeof object//object

typeof name//string

toString()方法返回对象的字符串,valueOf()返回对象的原值,一般情况下,valueOf()的优先级高于toString(),在alert()中相反

类型转换

转换标准:
如果只有一个bool,转化成number;
如果一个number一个string,string转化成number;
如果一个对象,优先调用valueOf()方法,没有调用toString()转化成'[Object 真实类型]'或’字符串‘,再根据上述两个方法再转化
对象之间不相等(最相等运算时比较的是值,指针存储的是对象的内存地址,不同对象即使内容相同但是开辟内存空间不同地址也就不同,所以不等)

1、boolean([])==true//true
首先[]是对象object,调用toString()为'[Object array]'转bool为true

2、[]==![]//true
[]转换成数字为0
!进行bool判断,优先将【】转换为bool类型为true,!true为false,false转化为数字为0

3、NAN!==NAN//true

包装对象

存取字符串、数字或bool值得属性创建的临时对象成为包装对象
可以通过string、Number()、Boolean()来显示创建包装对象

new String("a")
new Number(1)
new Boolean(false)

函数形参

函数形参列表在ECMAscript内部是用数组装的,浏览器只关心数组而不关心数组内部元素,传递参数解构赋值对应相应的形参
可以通过arguments对象来遍历参数

函数作用域

var scope='global'
function a(){
  console.log(scope)//undefined
  var scope='local'
  console.log(scope)//local

输出undefined是因为函数作用域的特性,函数体内局部变量的优先级高于同名全局变量,函数体内局部变量覆盖同名全局变量并将该变量提升,初始化留在原先位置
var scope='global'
function a(){
  var scope
  console.log(scope)//undefined
  scope='local'
  console.log(scope)//local



变量的生命周期

全局变量的生命周期永久除非主动销毁该变量

局部变量在函数调用结束后立刻销毁

通过闭包可以不让将局部保量保存不立刻被销毁

变量作用域

函数体内的局部变量用var声明且只能在函数体内访问得到,函数体内变量可以访问函数体外部的变量(随着作用域链逐级向上查找),但是函数体外部变量无法访问内部变量

立即执行函数(IIFE)以及声明函数区别

立即执行函数将匿名函数包裹在一对圆括号中(),例如
for(var i= 0; i < 10 ; i++){
      var a=(function(e){
         console.log(e)
      })(i)
}

声明函数
for(var i= 0; i < 10 ; i++){
      var a=function(e){
         console.log(e)
      }
      a(i)
}

位运算符:https://blog.youkuaiyun.com/qq_41218152/article/details/81562202

与运算符&:相应位操作数都为1,则为1
或运算符||:相应位操作数有一个1或都是1,则为1
非运算符~:操作数所有位取反
异或运算符^:相应位操作数只有一个1,则为1
左移运算符<<:左移1位相当于乘以2,左移两位相当于乘以4,依次类推
右移运算符>>:左移1位相当于除以2,左移两位相当于除以4,向下取整,依次类推
无符号右移>>>:左边高位总是被0填补


负数计算方法:
例如-1
先求1的二进制(32位补齐):0000 0000 0000 0000 0000 0000 0000 0001
再按位取反:             1111 1111 1111 1111 1111 1111 1111 1110
再加1:                 1111 1111 1111 1111 1111 1111 1111 1111
也就是0xFFFFFFFF

eval()函数

只接收一个参数
不是字符串直接返回该参数
是字符串将其按照js代码进行编译,并可以更改局部变量给其重新赋值;
如果在代码最顶层使用了eval()或别名指代它,将作用于全局变量和局部变量

ReferenceError、SyntaxError

ReferenceError(引用错误):非法或不能识别的引用数值
例如:console.log(a)//查找上下文未发现a,报Uncaught ReferenceError:a is not defined


SyntaxError(语法错误)
例如:var a=function(){
      }
    return a;//return在函数体内起作用,写在全局内是不允许的,报SyntaxError错误

对象属性

获取对象属性可以通过.或者["属性名"]的方式获取
如果属性名为js本身的类似于for、class等的保留字,只能通过[]的方式获取属性值
在js对象中可以创建多个属性,通过[]可以直接访问他们的属性但包含在[]内的字符串不需要为标识符而是使用类似数组的写法[]可以获取到

对象属性getter、setter

由getter和setter定义的属性为存取器属性
存取器属性都是成对定义的函数
定义函数不用function开头而是用get、set开头,并且函数名相同
存取器属性可继承
存取器内的getter、setter的this指向定义函数体时的父元素对象(默认将get、set函数当做对象方法调用)
//cunquqi是可读写的存取器属性
get cunquqi(){},
set cunquqi(newValue){}

[,,]

var a=[,,]//数组直接量允许有可选的逗号结尾,此时数组a内有两个元素
a[0]//undefined
a[1]//undefined

负数和非整数可以当作数组索引。
a[-1.23]=true//-1.23是索引值
a['1000']=0//这是数组的第1001个元素

数组元素删除

删除一个数组元素不会改变数组的length,也不会从高位向前填补删除位,删除位不存在变成稀疏数组

a=[1,2,3]
delete a[2]=>[1,2,,]
a.length//3
2 in a//false,省略掉的元素不存在

排除数组中null、undefined、不存在的元素

for(var i=0;i<a.length;a++){
   if(!a[i]) continue;//排除null、undefined、不存在元素
   if (a[i]===undefined) continue;//排除undefined元素
   if(!(i in a)) continue;//排除不存在元素
 }

常用数组方法:https://blog.youkuaiyun.com/qq_39132756/article/details/85007082

reduce()

reduce(function(pre,val,index,arr){

},init)

// pre 上次调用函数的返回值

// val 本次操作值

// inedx val索引值

// arr 当前数组

// init 初始值,首次调用传入值



var a = [1, 2, 3]
    a.reduce((a, b) => {
        console.log(a, b)
    })
    //首次传参,1  2
    //pre为上次调用函数返回值,没有return值,就返回undefined, undefined 3

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值