js相关

  • typeof一个对象时,如果对象内部没有实现[[Call]]属性,返回object,否则返回function
  • escape编码所有非ASCII字符,但是unicode支持不好
  • data-num=5,data-bol=true;得到的类型都是字符串类型;
  • window.onerror 只能捕获在try里出错的内容;

    函数节流

    函数节流背后的基本思想是,某些代码不可以在没有间断的情况连续重复执行。
    第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码。
    当第二次调用该函数时,它会清除前一次的定时器并设置另一个。
    如果前一个定时器已经执行过了,这个操作就没有任何意义。
    然而,如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器。
    目的是只有在执行函数的请求停止了一段时间之后才执行。
    functionthrottle(method,context){
    clearTimeout(method.tId);
    method.tId=setTimeout(function(){
    method.call(context);
    },100);
    }
    

    WeakSet和WeakMap

    WeakSet和WeakMap在使用上跟Set和Map的区别主要是:WeakSet中的元素和 Weakmap 中的 key都只能是对象类型( WeakMap的value可以是任意类型);WeakSet和 WeakMap都没有 size属性; WeakSet和 WeakMap都没有 clear方法; WeakSet和 WeakMap 都不可以遍历所包含的元素。

  • weakmap,weakset和map,set最大的区别是,weakmap只能用对象作为key,weakset只能存储对象;
  • 普通的object,apply数组的push/pop,unshift/shift,splice方法后,如果会自动添加length属性;调用这些方法后,length会自动改变; 但是如果初始时,加了一个默认的length且值大于0,则数据添加在length指定的位置,前面可能为空;下面的代码注意加splice的区别: ``` vara={ b:123, length:2, push:Array.prototype.push } a.push(1) a.push(2,3) console.log(a) //{2:1,3:2,4:3,b:123,length:5,slice:ƒ,push:ƒ}

vara={ b:123, length:2, splice:Array.prototype.splice, push:Array.prototype.push } a.push(1) a.push(2,3) console.log(a) //Object(5) [empty×2,1,2,3,b:123,splice:ƒ,push:ƒ]

### 函数参数length
> 函数的length属性获取的是形参的个数,但是形参的数量不包括剩余参数个数,而且仅包括第一个具有默认值之前的参数个数,看下面的例子

((a,b,c)=>{}).length;//3

((a,b,c=3)=>{}).length;//2

((a,b=2,c)=>{}).length;//1

((a=1,b,c)=>{}).length;//0

((…args)=>{}).length;//0 ```

string 函数区分

  • slice :这个方法用于截取字符串的一部分,它有两个参数,分别表示要截取的字符串 的起始位置和结束位置,如果大于 0,则从前面计数,如果小于 0,则从后面计数,如果省略第二个参数,则会截取到字符串的末尾;
  • substring :这个方法和 slice类似,也是截取字符串中的一部分,它的两个参数也分别 表示字符串的起始位置和结束位置,所不同的是 substring 中如果结束位置在起始位置之前,则会自动将其调换之后再截取,当参数小于 0 时会按 0 处理;
  • substr并不是标准里的方法。 substr方法也 有两个参数,第一个参数也是起始位置,第二个参数表示要截取的长度 。 如果第一个参数是 负数,则会从字符串的后面向前面计数(同 slice方法)

String.raw

String的raw方法有两种用法,一种用在字符串模板上,另一种用在数组转换为字符串时。 用在字符串模板上时不需要使用括号,返回值为没有转义的字符串(如果直接使用字符串模板则会将相应的转义字符转换为对应的内容)。 用在数组转换为字符串时,第一个参数是一个只包含一个属性的对象,其属性名为raw, 属性值为一个数组(也可以使用字符串,这时每个字符都相当于数组的一个元素),后面的参数为raw数组转换为字符串时中间的分隔符,例如下面的例子。 str=String.rawa\tb\tc; console.log(str);//a\tb\tc //使用raw连接数组 str=String.raw({raw:[1,2,3])),”、”,”\”); console.log(str);//1、2\3,”\”表示捺斜线“\”,其中第一个“\”为转义符 //使用raw连接字符串 str=String.raw({raw:”赵钱孙李”},1,2);//赵1钱2孙李

normalize方法

Unicode编码的目的是统-所有语言的编码,但是由于不同语言各有自己独有的特点,所以Unicode并没有做到字符与编码的完全一一对应。例如,汉语拼音中带音调的字母就有两种表示方法,一种是把它作为一个独立的字符,另一种是将字母和音调分开作为两个字符来看待,就像 a可以看作一个独立的字符,这时它的Unicode编码为\u0101,即Ox0101,但是a也可以 看成是由a和·两个字符组成的,其中,a的Unicode编码为\u0061,也就是十进制的97(a的ASCII码),声调,的Unicode编码为\u0304,所以a也可以看成是由\u0061\u0304两个Unicode编码组成的。 这种一个字符有两种编码方式的情况给我们带来的最直接的麻烦就是在比较字符是否相同的时候,如果相同的字符使用了不同的编码,那么判断时容易发生误判,而新增的normalize方法正是来解决这个问题的。normalize方法的作用是将字符统一转换为指定的编码格式。normalize方法有一个参数,用来指定转换的方式,参数有4个可以使用的值,它们分别是“NFC”“NFD”“NFKC”和“NFKD”,具体含义如下。

  • NFC:Normalization Form Canonical Composition的缩写,表示统一为标准的合成格式,例如a会规范为\u0101,这也是默认的格式。
  • NFD:Normalization Form Canonical Decomposition的缩写,表示统一为标准的分解格式,例如a会规范为\u0061\u0304。
  • NFKC:Normalization Form Compatibility Composition的缩写,表示统一为兼容的合成格式,例如a会规范为\u0101。
  • NFKD:NormalizationFormCompatibilityDecomposition的缩写,表示统一为兼容的分解格式,例如a会规范为\u0061\u0304。 console.log(‘\u0061\u0304’.normalize(‘NFC’)) var m = ‘\u0061\u0304’.normalize(‘NFC’);//m.length=1 var n=m.normalize(‘NFD’)//n.length=2

编码示意

缓存对象

ES2015 中新增了缓存类型,相关的对象一共有三个: ArrayBuffer, Typed.Array 和 DataView。 使用缓存进行操作的速度更快,缓存主要适用于对大量二进制数据的操作。

  • ArrayBuffer指一块作为二进制缓存使用的内存区,它自己并不直接操作数据,而是需要使用 TypedArray 或者 DataView 进行操作 。
  • TypedArray 的作用是按具体的格式 (类型)来操作 ArrayBuffer 的缓存数据,它并不是一 种实际的类型,而是多种类型的总称, 具体包括 9 种类型, TypedArray具体类型

  • DataView是一种比 TypedArray更加灵活的使用 ArrayBuffer缓存操作数据的类型。 内存示意

图中最上面的是 buffer缓存 ,一共有 16个字节(每个字节是 8位二进制数), 它只是用来保存数据,但不可以自己操作数据; 中间的是使用 buffer创建的各种typearray,以及它 们跟 buffer的对应关系;最下面的是 DataView跟 buffer的对应关系。 TypedArray和 DataView 只是操作缓存数据的工具,它们本身并不存储数据,上述例子中所创建的所有 TypedArray和 DataView类型对象的数据都保存在相同的缓存区域,因此它们的操作会相互影响。

Array.from ( iterns [ , mapfn [ , thisArg ] ] )

copyWithin

Array.prototype 中的 copyWithin方法和自11 方法类似 ,不同之处在于,fill方法填充的是 指定内容,而 copyWithin方法是将数组自己的一部分填充到其他位置,调用语法如下。 array.copyWithin (target, start [ , end] ); 此方法的三个参数都为数字类型,第一个参数 target表示要填充的起始位置,后两个参 数表示从什么位置复制元素。 第二个参数 start不可省略,表示复制元素的起始位置。 第三个 参数可省略,表示复制元素的结束位置,默认值为数组的长度