Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2019年9月8日 #15

Open
hello-tsai opened this issue Sep 8, 2019 · 10 comments
Open

2019年9月8日 #15

hello-tsai opened this issue Sep 8, 2019 · 10 comments

Comments

@hello-tsai
Copy link
Owner

script 标签的属性:
async:只对外部脚本有效,表示应该立即下载脚本,但不应妨碍页面中的其他操作,
defer:表示脚本可以延迟到文档完全被解析和显示之后执行。
没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

<script async src="script.js"></script>

有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。

<script defer src="myscript.js"></script>

有 defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成
defer:元素解析完之后执行,按照加载顺序执行脚本
async:加载完后立即执行,
defer 和 async 在网络读取(下载)这块儿是一样的,都是异步的(相较于 HTML 解析)
它俩的差别在于脚本下载完之后何时执行,显然 defer 是最接近我们对于应用脚本加载和执行的要求的
关于 defer,此图未尽之处在于它是按照加载顺序执行脚本的,这一点要善加利用
async 则是一个乱序执行的主,反正对它来说脚本的加载和执行是紧紧挨着的,所以不管你声明的顺序如何,只要它加载完了就会立刻执行
仔细想想,async 对于应用脚本的用处不大,因为它完全不考虑依赖(哪怕是最低级的顺序执行),不过它对于那些可以不依赖任何脚本或不被任何脚本依赖的脚本来说却是非常合适的,最典型的例子:Google Analytics

@hello-tsai
Copy link
Owner Author

函数内的变量会在函数退出后直接销毁。不加var 或者let 就会声明全局变量,在函数外部的任何地方都可以被访问到,但是不推荐
理由:在局部作用域中定义的全局变量。很难维护,且在严格模式下会抛出错误。

@hello-tsai
Copy link
Owner Author

typeof操作符
console.log(typeof (11));//"number"
console.log(typeof ("11"));//"string"
console.log(typeof (null));//"object"
console.log(typeof (undefined));//"undefined"
let obj={
a:'b'
};
function f() {
return 0;
}
let arr = [1,2,3]
console.log(typeof (obj));//"object"
console.log(typeof (f));//"function"
console.log(typeof (arr))//"object"
console.log(typeof (NaN));//"number"

@hello-tsai
Copy link
Owner Author

判断一个函数是否声明?
typeof (a) === "undefined"

@hello-tsai
Copy link
Owner Author

从逻辑来看,null值表示一个空对象指针,所以typeof才会为object。
个人理解:undefined表示未声明,null表示声明了,但是值为空。

@hello-tsai
Copy link
Owner Author

转换为false的值
“ “,false,0和NaN,undefined, null,
console.log(Boolean(0));//false
console.log(Boolean());//false
console.log(Boolean(NaN));//false
console.log(Boolean(false));//false
console.log(Boolean(null));//false

@hello-tsai
Copy link
Owner Author

Number类型使用IEEE754格式来表示浮点数和整数。
永远不要测试某个特定的浮点数的值,因为0.1+0.2 != 0.3 等于0.30000000000000004,这个小小的误差导致无法测试某个浮点数的值
JS能表示的最小数为 Number.MIN_VALUE
console.log(Number.MIN_VALUE);//5e-324
JS能表示的最大的数是
console.log(Number.MAX_VALUE);//1.7976931348623157e+308

如果超出了Number.MAX_VALUE的数会被转化为Infinity
如果小于Number.MIN_VALUE的数则会被转为-Infinity

任何涉及NaN的操作都会返回NaN,NaN与任何值都不等包括其本身
console.log(NaN == NaN);//false
针对NaN的特点,出了isNaN函数-任何不能被转换为数值的都会返回true
console.log(isNaN(NaN));//true
console.log(isNaN(0));.//false 0 被转换成数值
console.log(isNaN("99"));//fasle “99”被转换成数值 99
console.log(isNaN(""));//false “ ”被转换成数值 0
console.log(isNaN(null));//false null 被转换成数值 0
console.log(isNaN(undefined));//true
console.log(isNaN("wo"));//true
console.log(Number(null));//0
console.log(Number(undefined));//NaN

@hello-tsai
Copy link
Owner Author

把非数值转换为数值的函数
Number parseFloat parseInt

@hello-tsai
Copy link
Owner Author

hello-tsai commented Sep 10, 2019

Number 转换规则(一元+号的操作与Number相同)
console.log(Number(9));//9 是数字就直接转换成数字
console.log(Number(false)); // 0 布尔值 false为0 true为1
console.log(Number(null));// 0 null直接转为0
console.log(Number(undefined)); // NaN undefined 转为NaN
console.log(Number("9")); //9 字符串里如果是个数字 直接返回数字
console.log(Number("9.9999"));//9.9999 如果是浮点数 直接返回浮点数
console.log(Number(0xf));//如果是十六进制,返回十进制的数
console.log(Number("aaa"));//如果字符串里有其他字符直接返回NaN
console.log(Number(obj));// NaN
console.log(Number(" "));//0 空字符串转为0
如果是 对象 就会先调用valueOf( )方法,如果结果为NaN再调用toString方法,按照上面的规则转换。

@hello-tsai
Copy link
Owner Author

hello-tsai commented Sep 10, 2019

因为Number在转换数值时比较复杂且不够合理,因此在处理整数时,更常用parseInt()
parseInt会忽略前面的空格直到找到第一个非空格字符,如果第一个字符不是数字或者负号直接返回NaN,即 遇到空字符串会返回NaN这点与Number不同,然后返回非数字前的数字。
console.log(parseInt(1));// 1 数字直接返回数字
console.log(parseInt("1"));//1 字符串里只有数字直接返回数字
console.log(parseInt(null));// NaN 这里与Number不同,Number转为0
console.log(parseInt(undefined));// NaN undefined 转为NaN
console.log(parseInt("132aaa"));// 132 转为非数值前面
console.log(parseInt("-111aa"));// -111 转为非数值前面
console.log(parseInt(0xf));// 15 转为10进制
console.log(parseInt(" "));//NaN 空字符串返回NaN Number返回0

parseInt(value,进制),parseInt提供了第二个参数指进制,为了解决ES3和ES5会将例如070转为不同进制的数,于是就提供了第二个参数,来保证结果的正确,如果指定了第二个参数,value值可以不添加前缀
例:
console.log(parseInt(16, 10));//16
console.log(parseInt(16, 16));//22
console.log(parseInt(16, 8));//14
console.log(parseInt(16, 2));//1

parseFloat和parseInt是类似的,只是一个会忽略小数点一个不会。

@hello-tsai
Copy link
Owner Author

字符串的特点是:字符串是不可变的,即一旦创建字符串,他的值就不能改变,要改变的话只能销毁原来的字符串,再用另一个新的字符串填充该变量。
var lang = "java"
lang = lang+"script"
lang//"javascript"
lang改变了值之前就销毁了原来的值“java“

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant