红宝书记录1-3
三个组成部分:ECMAScript,DOM,BOM
script标签属性:
1.外部脚本使用:src(URL)
- async 异步下载,不阻塞文档呈现。不保证顺序执行
- defer 延迟下载,文档完全呈现后才下载
2.type 类型即MIME:媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。它在IETF RFC 6838中进行了定义和标准化。常用text/javascript,其他很少用,看一下就行。
类型 | 描述 | 典型示例 |
---|---|---|
text | 表明文件是普通文本,理论上是人类可读 | text/plain , text/html , text/css, text/javascript |
image | 表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型 | image/gif , image/png , image/jpeg , image/bmp , image/webp , image/x-icon , image/vnd.microsoft.icon |
audio | 表明是某种音频文件 | audio/midi , audio/mpeg, audio/webm, audio/ogg, audio/wav |
video | 表明是某种视频文件 | video/webm , video/ogg |
application | 表明是某种二进制数据 | application/octet-stream , application/pkcs12 , application/vnd.mspowerpoint , application/xhtml+xml , application/xml , application/pdf |
-
关于instanceof和typeof的区别:typeof可以直观的区别出数值类型,但是对于如数组、正则、日期、对象等的引用类型返回的都是Object。instance(实例);A instanceof B : A沿着proto这条线来找,同时B沿着prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。
-
六种类型外,这里记下es6新增的:
-
symbol:Symbol()创建(独一无二),Symbol().for()创建同一Symbol值。
定义对象属性时使用[],不能使用.进行访问,只能使用Obj.getOwnPropertySymbols()遍历;Reflect.ownKeys()返回所有属性(包括symbol)。
可用它定义内部私有属性或方法:
-
BigInt 不说,精度问题
ES3和ES5,解析八进制存在分歧!
关于数据类型转换问题:
下表展示了使用不同的数值转换为数字(Number), 字符串(String), 布尔值(Boolean):
原始值 | 转换为数字 | 转换为字符串 | 转换为布尔值 |
---|---|---|---|
false | 0 | “false” | false |
true | 1 | “true” | true |
0 | 0 | “0” | false |
1 | 1 | “1” | true |
“0” | 0 | “0” | true(字符串不为空) |
“000” | 0 | “000” | true |
“1” | 1 | “1” | true |
NaN | NaN | "NaN"(正常思路) | false |
Infinity | Infinity | “Infinity” | true(无穷大不为0,所以仍为true) |
-Infinity | -Infinity | “-Infinity” | true |
“” | 0 | “” | false |
“20” | 20 | “20” | true |
“Runoob” | NaN(包含了非数字的字符) | “Runoob” | true |
[ ] | 0 | “” | true(数组是对象) |
[20] | 20 | “20” | true |
[10,20] | NaN(数组长度大于1) | “10,20”(jion(’,’)拼接) | true |
[“Runoob”] | NaN(包含了非数字的字符) | “Runoob” | true |
[“Runoob”,“Google”] | NaN | “Runoob,Google” | true |
function(){} | NaN | "function(){}" | true |
{ } | NaN | "[object Object]" | true |
null | 0(空指针,定义过,赋值0) | “null” | false |
undefined | NaN(未定义的值) | “undefined” | false |
parseFloat和parseInt的区别在于①小数点②只能解析10进制
有意思的一点,argument的值永远和对应命名参数的值保持同步(但是内存空间独立)
function doAdd(num1,num2){arguments[1]=10;console.log(arguments[0]+num2)}
=>undefined
doAdd(0,0)
=>10
一个问题,看到这个行为之后习惯性的写下了箭头函数,然后就。。。
热爱学习的我们当然要打破砂锅问到底啦。
参考链接:https://blog.fundebug.com/2019/09/16/anomalies-in-javascript-arrow-functions/
平常开发中让我们觉得箭头函数他就是函数了,但其实,箭头函数也许可以把箭头函数看作是异常的 JS 函数。下面对比下差异
-
严格与非严格模式下,都不能有重复的命名参数
// 只要你敢写成重复的参数,我就敢死给你看 const logParams = (first, second, first) => { console.log(first, second); }
-
箭头函数没有arguments绑定,但是它可以访问最近的非箭头函数的arguments对象(!!这不就跟我们的箭头函数处于定义时的执行上下文环境一样的道理吗)
-
箭头函数永远不能用作构造函数,自然不能使用new关键字构造,也就没有prototype属性了。
-
在函数的整个生命周期中,箭头函数内部的值保持不变,并且总是与接近的非箭头父函数中的值绑定。
知道了既然箭头函数没有argument参数(有也是最近的非箭头函数的),那我们可以怎样做呢?
一种时在函数内部返回箭头函数,明显很傻;
另外就是es6 rest参数了
doAdd = (...args)=>{return args[0]+args[1]}
=>(...args)=>{return args[0]+args[1]}
doAdd(0,0)
=>0
arguments和rest的区别:
rest
参数与函数内部的arguments
对象不同。rest
参数是一个实际的函数参数,而arguments
对象是一个绑定到函数作用域的内部对象。- 一个函数只能有一个
rest
参数,而且它必须位于最后一个参数。这意味着函数可以包含命名参数和rest
参数的组合。 - rest 参数与命名参数一起使用时,它不包含所有传入的参数。但是,当它是惟一的函数参数时,表示函数参数。另一方面,函数的
arguments
对象总是捕获所有函数的参数。 rest
参数指向包含所有捕获函数参数的数组对象,而arguments
对象指向包含所有函数参数的类数组对象。
箭头函数最后一件事: