美文网首页
JavaScript严格执行

JavaScript严格执行

作者: wyude | 来源:发表于2016-11-08 16:39 被阅读0次

    strict模式

    启用strict模式的方法是在JavaScript代码的第一行写上:
    'use strict';
    
    • 数据类型

    Number

    1.计算机中的float类型都是不能直接比较的
    2.NaN:not a number,表示无法计算结果。
    3.Infinity:表示无限大。
    

    比较运算符

    1.==,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
    2.===,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较;
    3.不要使用==比较,始终坚持使用===比较。
    4.NaN这个特殊的number与所有其他值都不相等,包括它自己。NaN===NaN;//false
    4.所以,判断NaN只能通过isNaN()函数。isNaN(NaN);//true
    5.要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值。
        1 / 3 === (1 - 2 / 3); // false
        Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
    

    null 与 undefined

    null表示一个“空”的值,它和0以及空字符串''不同,
    0是一个数值,''表示长度为0的字符串,而null表示“空”。
    还有一个和null类似的undefined,它表示“未定义”。
    JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。
    事实证明,这并没有什么卵用,区分两者的意义不大。
    大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
    

    String

    *需要特别注意的是*,字符串是不可变的,
    如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果。
    而JavaScript为字符串提供的一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串。
    

    数组

    1.JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。
    var arr = [1, 2, 3.14, 'Hello', null, true];
    2.要取得Array的长度,直接访问length属性。
    arr.length; // 6
    3.*请注意*,直接给Array的length赋一个新的值会导致Array大小的变化。
      var arr = [1, 2, 3];
      arr.length; // 3
      arr.length = 6;
      arr; // arr变为[1, 2, 3, undefined, undefined, undefined]
      arr.length = 2;
      arr; // arr变为[1, 2]
    4.*请注意*,如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化。
      var arr = [1, 2, 3];
      arr[5] = 'x';
      arr; // arr变为[1, 2, 3, undefined, undefined, 'x']
    但是,如果仅是访问而没有赋值是不会改变的。
      var a=[1,2,3];
      alert(a);//1,2,3
      var x=a[5];
      alert(a[5]);//undefined
      alert(a);//1,2,3
    

    对象

    JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。
    var xiaoming = {
        name: '小明',
        birth: 1990,
        'middle-school': 'No.1 Middle School',
        height: 1.70,
        weight: 65,
        score: null
    };
    访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来:
    xiaoming.name; // '小明'
    xiaoming.birth; // 1990
    xiaohong['middle-school']; // 'No.1 Middle School'
    xiaohong['name']; // '小明'
    xiaohong.name; // '小明'
    如果访问一个不存在的属性会返回什么呢?JavaScript规定,访问不存在的属性不报错,而是返回undefined。
    由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:
    var xiaoming = {
        name: '小明'
    };
    xiaoming.age; // undefined
    xiaoming.age = 18; // 新增一个age属性
    xiaoming.age; // 18
    delete xiaoming.age; // 删除age属性
    xiaoming.age; // undefined
    delete xiaoming['name']; // 删除name属性
    xiaoming.name; // undefined
    delete xiaoming.school; // 删除一个不存在的school属性也不会报错
    要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:
    var xiaoming = {
        name: '小明'
    };
    xiaoming.hasOwnProperty('name'); // true
    xiaoming.hasOwnProperty('toString'); // false
    

    条件判断

    JavaScript把null、undefined、0、NaN和空字符串''视为false,其他值一概视为true。
    

    Map和Set

    1.JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对。
    2.但是JavaScript的对象有个小问题,就是键必须是字符串。
      但实际上Number或者其他数据类型作为键也是非常合理的。
      为了解决这个问题,最新的ES6规范引入了新的数据类型Map。
      var m = new Map();
      var s = new Set();
    3.初始化Map需要一个二维数组,或者直接初始化一个空Map。Map具有以下方法:
      var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
      m.get('Michael'); // 95
      var m = new Map(); // 空Map
      m.set('Adam', 67); // 添加新的key-value
      m.set('Bob', 59);
      m.has('Adam'); // 是否存在key 'Adam': true
      m.get('Adam'); // 67
      m.delete('Adam'); // 删除key 'Adam'
      m.get('Adam'); // undefined
    4.在Set中,没有重复的key。
      要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set:
      var s1 = new Set(); // 空Set
      var s2 = new Set([1, 2, 3]); // 含1, 2, 3
      重复元素在Set中自动被过滤:
      var s = new Set([1, 2, 3, 3, '3']);
      s; // Set {1, 2, 3, "3"}
    5.通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果,
      通过delete(key)方法可以删除元素。
    

    iterable

    1.遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。
    2.for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。
      一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。
      当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:
      var a = ['A', 'B', 'C'];
      a.name = 'Hello';
      for (var x in a) {
        alert(x); // '0', '1', '2', 'name'
      }
    3.for ... of循环则完全修复了这些问题,它只循环集合本身的元素:
      var a = ['A', 'B', 'C'];
      a.name = 'Hello';
      for (var x of a) {
        alert(x); // 'A', 'B', 'C'
      }
    4.更好的方式是直接使用iterable内置的forEach方法,
      它接收一个函数,每次迭代就自动回调该函数
      var a = ['A', 'B', 'C'];
      a.forEach(function (element, index, array) {
        // element: 指向当前元素的值
        // index: 指向当前索引
        // array: 指向Array对象本身
        alert(element);
      });
      Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:
      var s = new Set(['A', 'B', 'C']);
      s.forEach(function (element, sameElement, set) {
        alert(element);
      });
      Map的回调函数参数依次为value、key和map本身:
      var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
      m.forEach(function (value, key, map) {
        alert(value);
      });
      如果对某些参数不感兴趣,由于JavaScript的函数调用不要求参数必须一致,因此可以忽略它们。
      例如,只需要获得Array的element:
      var a = ['A', 'B', 'C'];
      a.forEach(function (element) {
        alert(element);
    });
    

    相关文章

      网友评论

          本文标题:JavaScript严格执行

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