学习js中被自己忽略的细节,持续更新

时间:2023-02-10 15:44:10
<script>标签的属性async和defer的异同:

    两者都是异步加载js,即在渲染dom的同时加载解析js文件。不同之处在于,存在async属性的js文件会在加载的同时去执行,即渲染dom、加载js文件和执行js文件是并行的;存在defer属性的js文件在渲染完dom后才会执行,即渲染dom和加载js文件是并行的,当渲染完dom后才会执行js。defer属性更符合实际应用,它考虑到了文件和dom的依赖关系。但是把<script>标签放到body标签前面位置时,就不需要defer属性了,加上会有点画蛇添足。ps:w3school中“只有Internet Explorer 支持defer属性”的说法是错误的,http://www.w3school.com.cn/tags/att_script_defer.asp。

<noscript>标签:

    该标签中的内容在浏览器不支持脚本或者脚本被禁用的情况下显示。一般用来显示提示信息“本页面需要启用javascript。”

isNaN:

    isNaN函数会尝试把接受的参数转换为数字类型,转换失败会返回true,转换成功会返回false。所以isNaN("10")返回false,isNaN(true)会返回false,isNaN(null)返回false,isNaN(false)也会返回false。测试对象时,会调用对象的valueOf()方法,检测返回值能否转为数值,如果不能,再调用返回值的toString()方法,再测返回值。转换机制与Number()函数的转换规则一致。

switch:
    在switch语句中使用任何数据类型都可以(在很多语言中只能使用数值和字符型数据类型)。每个case值可以是变量、表达式。
var num = 1;
switch(true){//当case表达式结果和true相等时,运行当前case下的表达式
    case num<0:
    alert("<0");
    break;
    case num=0:
    alert("=0");
    break;
    default:
    alert("<0");
}

    switch语句在比较时,用的全等(===),不会发生数据转换。

使用函数表达式定义函数:

    使用函数表达式定义函数,函数末尾要加分号,就像声明其他变量一样。

function myFunc1(){
    doSomeThing...
}
var myFunc2 = function(){
    doSomeThing...
};//注意这里有分号
new Boolean():
    使用false创建一个Boolean对象,对其进行判断,其实是对一个对象进行的判断,所以是true
var falseObj = new Boolean(false);
if(falseObj){//true
    console.log(falseObj);
}
重新声明变量:
var a = 1;
var a;
console.log(a);    //1
    像这样重新声明一个变量,没有效果。但是会执行声明中的变量初始化。