JS基础

作者: cccccccc7355608 | 来源:发表于2017-09-13 23:44 被阅读0次

    JavaScript 的数据类型

    • 数值(number):整数和小数(例如1和3.14)
    • 字符串(string):字符组成的文本(比如"Hello World"
    • 布尔值(boolean):true(真)和 false(假)两个特定值
    • undefined:表示“未定义”或不存在,即此处目前没有任何值
    • null:表示空缺,即此处应该有一个值,但目前为空
    • 对象(object):各种值组成的集合
    • Symbol:ES6引入的,一种类似于字符串的原始类型的值,由Symbol函数生成,每一个值都是独一无二的

    原始类型和复杂类型(对象类型)

    原始类型 复杂类型
    数值、字符串、布尔值、Symbol 对象

    JavaScript中有两个特殊的原始值(不可更改:任何方法都无法更改、突变一个原始值),他们不是数字、字符串和布尔值,通常分别代表各自特殊类型的唯一成员

    区别:原始类型是最基本的数据类型,不可细分、更改;复杂类型通常是包含了对个原始类型的值的集合(容器)

    犀牛书P33 对象类型(即复杂类型)可依据类划分为子类型:数组、函数、日期、正则、错误

    typeof 和 instanceof

    • typeof:检测操作数类型,返回值类型为字符串(any -> str)
    • instanceof:测试对象类,返回值类型为布尔值(obj,func -> str)

    上述二者都能让我们知道一个值的数据类型,但不同的是,typeof可以准确的返回原始值、函数、undefined的类型,对于其他对象类型的值,只会单一的返回 "object",无法精准判断;而 instanceof 专门针对对象类型的值,a instanceof A,当a的类是A时(即a是A的实例),则返回true,否则返回false,详见犀牛书P78

    判断变量类型

      var a = 1,
            b = 'nihao',
            c = true,
            d = function(){return 1;};
      typeof a; // "number"
      typeof b; // "string"
      typeof c; // "boolean"
      typeof d; // "function"
    

    NaN

    NaN:非数字值,它和任何值都不相等,包括自身。可以通过 x != x 来判断,当且仅当 x 为 NaN 时,返回 true,ES6中 Number 对象上新提供的 Number.isNaN() 也可检查一个值是否为 NaN

    个人理解:非数字值在JS的归类中划入数字,只是这个值无法用数字表示,例如在类型转换中,undefined"one"(非空,非数字)、['a'](其他数组)、function(){}`(任意函数),转换为数字时,结果都为 NaN,因为没办法找到一个数字来表示上述几种值,对象转换为数字的结果较为特殊,参考犀牛书P52

    非数值转换为数值

      // 显式转换
      Number()
      parseInt() // 注意参数个数
      parseFloat()
      // 隐式转换
      +x // 加号有两个作用,作为数值运算符,转换为数字(优先级最大);作为加法运算符,相加(优先级次之)参考犀牛书P66 运算符列表
      - -x // 有点多此一举,注意空格
    

    =====

    === 严格相等运算符

    • 如果两值类型不同,则不相等
    • 如果两个值都是 null 或者都是 undefined,则不相等
    • 如果两个值都是布尔值 true 或者都是布尔值 false,则相等
    • 如果其中一个值是 NaN,或者两个值都是 NaN,则不相等
    • 如果两个值为数字且数值相等,则相等。如果一个值为0,另一个为-0,也相等
    • 如果两个值为字符串,且所含的对应位上的16位数(犀牛书3.2节)完全相等,则他们相等。如果他们的长度或内容不同,则不等
    • 如果两个引用值指向同一个对象、数组或函数,则他们相等。如果指向不同的对象,则不等,即使两个对象具有完全一样的属性

    == 相等运算符

    • 如果两个操作数类型相同,则参照上述全等运算的规则
    • 如果两个操作数类型不同,应在转换类型之后再做比较
      • 如果一个为 null,另一个为 undefined,相等
      • 如果一个是数字,另一个是字符串,先将字符串转为数字,再比较
      • 如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较
      • 如果一个值是对象,另一个值是数字或字符串,参照犀牛书3.8.3节,用valueOf和toString转换后再比较
      • 其他不同类型之间的比较均不相等

    break和continue

    • break 用于强制退出循环体,执行循环后面的语句
    • continue 用于退出本次循环,执行下次循环

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

    • undefined 并不是保留词,只是全局对象的一个属性,在低版本的IE中能被重写,在ES5中,其只是全局对象的一个只读属性,但在局部作用域中仍然可以被重写
        (function(){
          var undefined = 10;
          // 10 -- chrome
          alert(undefined);
        })();
        (function(){
          undefined = 10;
          // undefined -- chrome
          alert(undefined);
        })();
      
    • void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void无论跟何种表达式,返回的都是 undefined。而最简便的就是 void 0。压缩代码时,常常用void 0代替undefined,因为void 是不能被重写的。

    示例

    console.log(1+1); // -> 2
    console.log("2"+"4"); // -> "24"
    console.log(2+"4"); // ->"24"   拓展 num->str时,常用 num+""
    console.log(+"4"); // -> 4   此时加号作为数值运算符
    
    var a = 1;
    a+++a;
    typeof a+2;
    // 解析
    /*
    a+++a  ->  (a++)+a,a++为后增量,a的值自增1,但返回自增前到值,即a++,返回1,a为2
    而typeof运算符优先级最高,要高于加法运算符,所以应理解为
    */
    var a = 1;
    a+++a; // (a++)+a; --> 1+2 --> 3  此时 a 为2
    typeof a+2; // --> (typeof a)+2 --> (type 2)+2 --> "number"+2 --> "number2"
    
    var a = 1;
    var b = 3;
    console.log( a+++b );
    /*
    同上,后增量   a+++b --> (a++)+b --> 1+3 --> 4
    结果为4
    拓展,++a+b
    ++a为前增量,a自增1,并且把自增后的值返回,
    如果题目改成 console.log( ++a+b ),就相当于
    (++a)+b --> 2+3 --> 5,结果便是5
    */
    

    遍历数组,打印数组每一项的平方

    var arr = [3, 4, 5];
    var result = arr.map(function(x){console.log(x*x);});
    

    遍历JSON,打印里面的值

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

    选做

    var a = 1, b = 2, c = 3;
    var val = typeof a + b || c >0;
    console.log(val) ;
    // 结果为 "number2"
    // var val = ((typeof a)+b) || (c>0);
    // var val = "number2" || true;
    // 返回 "number2"
    

    或运算符,会首先计算第一个操作数的值,也就是会先计算左侧的表达式,如果结果为真值,那么返回这个真值。否则,再计算第二个操作数的值,即计算右侧的表达式,并返回这个表达式的计算结果

    假值:undefined、null、0、-0、NaN、"" //空字符串,以上包括false都称为“假值”,在转换为布尔值时转为false,所有其他值,包括所有对象(数组)都会转换为true


    var d = 5;
    var data = d ==5 && console.log('bb');
    console.log(data);
    // 结果为 undefined
    // 解析
    // var data =((d == 5) && (console.log('bb')))
    // var data =(true && (console.log('bb')))
    // console.log('bb')  打印出字符串 'bb'  返回 undefined
    // var data =(true && undefined)
    // var data = undefined;
    

    对与运算符(&&)应有三重理解

    1. 当操作数都是布尔值的时候,“&&” 对两个值执行布尔与(AND)操作,只有在第一个操作数和第二个操作数都为true时,返回true。如果其中一个为false,返回false
    2. “&&” 可以对真值和假值进行布尔与(AND)操作。如果两个操作数都是真值,那么返回一个真值;否则,至少一个操作数是假值的话,则返回一个假值
    3. 若左操作数为假值,只返回左操作数,不对右操作数进行计算;若左操作数为真值时,“&&” 运算符将计算右操作数并将其返回作为整个表达式的计算结果,
      一言以蔽之,“左假返左,左真返右”

    var data2 = d = 0 || console.log('haha');
    console.log(data2);
    // 或运算理解,左操作数为假值,右操作数为假值(console.log()返回 undefined),返回右操作数结果,即返回 undefined
    // 因此只需返回右操作数,所以结果为 undefined
    

    var x = !!"Hello" + (!"world", !!"from here!!");
    console.log(x);
    // 解析
    // !!"Hello" -> true
    // !"world" -> false
    // !!"from here!!" -> true
    // 逗号运算符是二元运算符,先计算左操作数,再计算右操作数,最后返回右操作数的值
    // (!"world",!!"from here!!") -> (false,true) -> true
    // !!"Hello" + true -> true + true -> 1+1 -> 2
    // 此处的加号会让操作数先转换为数字,再进行计算,
    // 所以结果为 2
    

    “!” 运算符首先将其操作数转换为布尔值,然后再对布尔值求反。即 “!” 总是返回 true 或 false,并且,可以通过两侧逻辑非运算来得到一个值的等价布尔值:!!x

    相关文章

      网友评论

        本文标题:JS基础

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