• JS学习变量与基本语法(1)


    • js严格区分大小写
    • 数据类型:

    Number:

    123; // 整数123
    0.456; // 浮点数0.456
    1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
    -99; // 负数
    NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
    Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
    

      

    字符串

    布尔值

    比较运算符

    要特别注意相等运算符==。JavaScript在设计时,有两种比较运算符:

    ==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;

    ===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

    NaN === NaN; // false
    isNaN(NaN); // true
    
    1 / 3 === (1 - 2 / 3); // false浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
    Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
    

      

    null和undefined

    JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用nullundefined仅仅在判断函数参数是否传递的情况下有用。

    数组

    [1, 2, 3.14, 'Hello', null, true];
    
    new Array(1, 2, 3); // 创建了数组[1, 2, 3]
    var arr = ['Apple', 'Google', 'Microsoft'];
    var i, x;
    for (i=0; i<arr.length; i++) {
        x = arr[i];
        alert(x);
    }

     

    对象

    var person = {
        name: 'Bob',
        age: 20,
        tags: ['js', 'web', 'mobile'],
        city: 'Beijing',
        hasCar: true,
        zipcode: null
    };
    

     

    变量

     变量名是大小写英文、数字、$_的组合,且不能用数字开头。

    默认不用var 定义则变量为全局变量;为修补这一缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。

     用strict模式的方法是在JavaScript代码的第一行写上:

    'use strict';
    

      

    循环

    for循环的3个条件都是可以省略的,如果没有退出循环的判断条件,就必须使用break语句退出循环,否则就是死循环:

    var x = 0;
    for (;;) { // 将无限循环下去
        if (x > 100) {
            break; // 通过if判断来退出循环
        }
        x ++;
    }
    

      for循环的一个变体是for ... in循环,它可以把一个对象的所有属性依次循环出来:

    ar o = {
        name: 'Jack',
        age: 20,
        city: 'Beijing'
    };
    for (var key in o) {
        alert(key); // 'name', 'age', 'city'
    alert(o[key]);//'jack','20' }

      由于Array也是对象,而它的每个元素的索引被视为对象的属性,因此,for ... in循环可以直接循环出Array的索引:for ... inArray的循环得到的是String而不是Number

    var a = ['A', 'B', 'C'];
    for (var i in a) {
        alert(i); // '0', '1', '2'
        alert(a[i]); // 'A', 'B', 'C'
    }
    

      

    Map和Set(ES6新增)

    JavaScript的默认对象表示方式{}可以视为其他语言中的MapDictionary的数据结构,即一组键值对。但是JavaScript的对象有个小问题,就是键必须是字符串。为了解决这个问题,最新的ES6规范引入了新的数据类型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
    
    //由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
    var m = new Map();
    m.set('Adam', 67);
    m.set('Adam', 88);
    m.get('Adam'); // 88
    

     SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

    //初始化
    var s1 = new Set(); // 空Set
    var s2 = new Set([1, 2, 3]); // 含1, 2, 3
    
    //重复元素自动被过滤
    var s = new Set([1, 2, 3, 3, '3']);
    s; // Set {1, 2, 3, "3"}
    //相关方法
    s.add(4);//添加
    s.delete(3);//删除
    

     

    iterable

    遍历Array可以采用下标循环,遍历MapSet就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,ArrayMapSet都属于iterable类型。

    具有iterable类型的集合可以通过新的for ... of循环来遍历。

    与for....in 的区别(引入的原因):

    //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'
    }
    
    //for ... in循环将把name包括在内,但Array的length属性却不包括在内。
    //for ... of循环则完全修复了这些问题,它只循环集合本身的元素:
    var a = ['A', 'B', 'C'];
    a.name = 'Hello';
    for (var x of a) {
        alert(x); // 'A', 'B', 'C'
    }
    
    
    var a = ['A', 'B', 'C'];
    var s = new Set(['A', 'B', 'C']);
    var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
    for (var x of a) { // 遍历Array
        alert(x);
    }
    for (var x of s) { // 遍历Set
        alert(x);
    }
    for (var x of m) { // 遍历Map
        alert(x[0] + '=' + x[1]);
    }

    更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。(ES5.1标准引入)

    //Array
    var a = ['A', 'B', 'C'];
    a.forEach(function (element, index, array) {
        // element: 指向当前元素的值
        // index: 指向当前索引
        // array: 指向Array对象本身
        alert(element);
    });
    
    
    //Set
    //与Array类似,没有索引,因此回调函数的前两个参数都是元素本身:
    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);//x y z
    });
    
    
    //如果对某些参数不感兴趣,由于JavaScript的函数调用不要求参数必须一致,因此可以忽略它们。例如,只需要获得Array的element:
    
    var a = ['A', 'B', 'C'];
    a.forEach(function (element) {
        alert(element);
    });
    

      

     

  • 相关阅读:
    Angular 学习笔记 (消毒 sanitizer)
    资源链接
    QM作品
    读书笔记
    javascript jQuery遇到的小问题 不定添加
    css 平时遇见CSS的一些小技巧 不定添加
    html 小却重要的问题 不定添加
    Array 对象
    test
    Javascript定义类(class)的三种方法
  • 原文地址:https://www.cnblogs.com/lyfingchow/p/7522962.html
Copyright © 2020-2023  润新知