美文网首页
数据类型运算符流程控制语句

数据类型运算符流程控制语句

作者: D一梦三四年 | 来源:发表于2017-09-16 23:40 被阅读0次

    1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?

    • 7种数据类型,Number, String, Boolean, Undefined, Null, Object, Symbol
    • 原始类型,Number, String, Boolean, Undefined, Null, Symbol
    • 复杂类型,Object
    • 原始类型和复杂类型的区别是什么

    2. typeof和instanceof的作用和区别?

    • typeof,作用于用于判断一个一个表达式、对象或原始值的数据类型,返回的是一个字符串,返回的值有(参照mdn):
    类型 结果
    Undefined "undefined"
    Null "object"
    Boolean "boolean"
    Number "number"
    String "string"
    Symbol (ES 6新增) "symbol"
    宿主对象 (由JS环境提供) Implementation-dependent
    函数对象 "function"
    其他对象 "object"
    • instanceof,用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,语法为object instanceof constructor,object 为要检测的对象,constructor 为某个构造函数,返回值为 true 或 false,如:
    var a = {};
    var b = [];
    a instanceof Object;   //true
    b instanceof Array;     //true
    [] instanceof Array;     //true
    

    3. 如何判断一个变量是否是数字、字符串、布尔、函数

    • 用 typeof 直接进行判断
    typeof a;        //"object"
    typeof 2;        //"number"
    typeof 'a';       //"string"
    typeof true;    //"boolean"
    function fn(){}
    typeof fn;       //"function"
    

    4. NaN是什么? 有什么特别之处?

    • NaN (Not a Number),typeof NaN //number 它本身是数值类型,但是它表示的是一个非数值,用于表示一个本来要返回数值的操作数未返回数值的情况
    • 特别之处:
      • 任何涉及到 NaN 的操作(例如 NaN/100)都会返回NaN
      • NaN 与任何值都不相等,包括 NaN 本身,所以判断一个值是否是 NaN,只能用函数Number.isNaN()isNaN()
    NaN == NaN;               // false
    NaN === NaN;             // false
    Number.isNaN(NaN);   //true
    isNaN(NaN);                // true
    

    5. 如何把非数值转化为数值?

    • Number() ,可以用于任何数据类型,转换规则如下
      • Boolean值,true 和 false 分别被转换为1 和 0
      • 数值,不变
      • Null,0
      • Undefined,NaN
      • 字符串,遵循如下规则
        1. 字符串中只包含数字(包括前面的 + - 号),则将其转换为十进制数值(会忽略前导的 0)
        2. 如果包含有效的浮点格式,则将其转换为浮点数(会忽略前导的 0)
        3. 如果包含有效的十六进制格式,则将其转换为相同大小的十进制数值
        4. 空字符串,0
        5. 如果字符串中包含除上述格式之外的字符,则将其转换为NaN
      • 对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值
    Number(true);         //1
    Number('');              //0
    Number('00123');    //123
    Number('hello');      //NaN
    
    • parseInt(),专门用于把字符串转换成数值,常用于处理整数
      • 忽略字符串前面的空格,如果第一个非空格字符不是负号或者数字字符,则返回 NaN
      • 如果是继续解析,直到解析完或者遇到了非数字字符
      • 可以指定第二个参数即转换时使用的基数
      • 不能识别小数点
      • 空字符串返回 NaN
    parseInt('1234blue');   //1234
    parseInt('');                  //NaN
    parseInt('A7C',16);      //2684
    
    • parseFloat(),专门用于把字符串转换成数值,常用于处理浮点数,与 parseInt() 相比区别如下
      • 可以识别字符串中第一个小数点
      • 只解析十进制值
      • 如果字符串可解析为整数,则返回整数
    parseFloat('1234blue');   //1234
    parseFloat('22.4.5');        //22.4
    parseFloat('0xAB');         //0
    parseFloat('1.68e8');       //168000000
    

    参考书籍《JS高程》

    6. == 与 === 有什么区别?

    • ==,先转换在比较
      转换规则如下
      • 如果有一个数是布尔值,则在比较相等性之前先将其转换为数值,true 为 1,false 为 0
      • 如果一个操作数是字符串,另一个操作数是数值,则在比较之前先将字符串转换
      • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值照前面的规则进行比较
        比较规则
      • undefined 和 null 是相等的
      • 如果有一个操作数是 NaN,则相等操作符返回 false
      • 如果两个操作数都是对象,则比较是不是同一个对象,如果两个操作数都指向同一个对象,相等操作符返回 true
    '1' == 1;                    //true
    true == 1;                 //true
    undefined == null;    //true
    NaN == 'NaN';          //false
    
    • ===,仅比较不转换,仅在两个操作数未经转换就想等的情况下返回 true

    7. break与continue有什么区别?

    • break,会立即退出循环,强制执行循环后面的语句。如下例:
    var num = 0;
    for (var i = 1; i < 10; i++) {
        if(i % 5 == 0) {
            break;
        }
        num++;
    }
    alert(num);      //4
    
    • continue,也是立即退出循环,但退出循环后会从循环的顶部继续执行
    var num = 0;
    for (var i = 1; i < 10; i++) {
        if(i % 5 == 0) {
            continue;
        }
        num++;
    }
    alert(num);      //8
    

    参考书籍《JS高程》

    8. void 0 和 undefined 在使用场景上有什么区别?

    • undefined,undefined 并不是保留词(reserved word),它只是全局对象的一个属性。在低版本 IE 中能被重写。
    var undefined = 10;
    alert(undefined);
    // undefined -- chrome
    // 10 -- IE 8
    

    undefined 在 ES5 中已经是全局对象的一个只读(read-only)属性了,它不能被重写。但是在局部作用域中,还是可以被重写的,所以undefined现常用于全局环境。

    (function() {
      var undefined = 10;      //局部变量
      alert(undefined);
    })();
      // 10 -- chrome
    
    (function() {
      undefined = 10;      //全局变量
      alert(undefined);
    })();
      // undefined -- chrome
    
    • void 0,void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void 后面你随便跟上一个表达式,返回的都是 undefined,都能完美代替 undefined!更重要的前提是,void 是不能被重写的(cannot be overidden)。事实上,不少 JavaScript 压缩工具在压缩过程中,正是将 undefined 用 void 0 代替掉了。
      参考文章:为什么用「void 0」代替「undefined」

    9. 以下代码的输出结果是?为什么?

    console.log(1+1);            //2,两数值相加,直接计算
    console.log("2"+"4");        //"24",两字符串相加,直接拼接
    console.log(2+"4");          //"24",只有一个操作数是字符串,将另一个转换为字符串,进行拼接     
    console.log(+"4");           //4,对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换
    

    10. 以下代码的输出结果是?

    var a = 1;
    a+++a;                 //3,++优先级高,可写为(a++) + (a),1+2=3
    typeof a+2;            //"number2", typeof 的优先级比较高,先输出 typeof a
     的结果字符串"number",再与数值2进行加法操作,得到结果字符串"number2"
    

    11. 以下代码的输出结果是? 为什么

     var a = 1;
     var b = 3;
     console.log( a+++b );        
    //4,++优先级高,先执行 a++,在+ b,即 1+3
    原因:a++ 返回原来的值,++a返回加1后的值。
    

    12. 遍历数组,把数组里的打印数组每一项的平方

    var arr = [3,4,5]
    for (var i = 0; i < arr.length; i++) {
        console.log(arr[i] * arr[i]);
    }
    

    13. 遍历 JSON, 打印里面的值

    var obj = {
     name: 'hunger', 
     sex: 'male', 
     age: 28 
    }
    for (i in obj) {
        console.log(obj[i]);
    }
    

    14. 以下代码输出结果是? 为什么

    var a = 1, b = 2, c = 3;
    var val = typeof a + b || c >0
    console.log(val) 
    //number2,优先级顺序为typeof,+,>,||;||逻辑或运算符在第一个操作数是对象时,返回第一个操作数
    
    var d = 5;
    var data = d ==5 && console.log('bb')
    console.log(data)
    //undefined, == 的优先级高于 &&, &&逻辑与操作符在第一个操作数是对象时,返回第二个操作数,data = 'bb',
    **但此处有坑,console.log('haha'); 控制台输出的是haha,但是将console.log('haha');这个语句赋值给一个变量,那么这个变量,就是undefined。(偷看了前面学姐的答案!)**
    
    var data2 = d = 0 || console.log('haha')
    console.log(data2)
    //undefined,||逻辑或运算符在第一个操作数的求值结果是 false 时,返回第二个操作数,data2 = 'haha'
    
    var x = !!"Hello" + (!"world", !!"from here!!");
    console.log(x)
    //2,!!为取两次非,优先级顺序为 ! !!,+,,;var x = true + true;
    

    相关文章

      网友评论

          本文标题:数据类型运算符流程控制语句

          本文链接:https://www.haomeiwen.com/subject/utmysxtx.html