zoukankan      html  css  js  c++  java
  • JS笔记

    js代码嵌入:js代码可以嵌入在网页head或body等任何地方,也可以放入单独的.js文件中然后通过<script src="">引入。

    调试js:在浏览器开发者工具的console面板中可以直接编写js代码。

    == ===:比较运算符相等和全等,==如果类型不同先转换类型,===如果类型不同这返回false。

    NaN:是特殊的Number类型,与任何值的不相等,包括它本身。唯一判断NaN的方法时isNaN(NaN)//true。

    strict模式:严格模式下必须使用var声明变量。在js代码的第一行写"use strict"来开启严格模式。

    多行字符串:ES6新增了多行字符串的表示方式,使用``反引号。

    模板字符串:ES6新增了模板字符串,`${varName}`。

    string:字符串可以类似数组一样操作,获取长度,索引字符等。

    数组:声明方式[1,2,obj]或new Array(1,2,obj)。

    对象:js对象是一个无序的键值对组成的集合,键必须是字符串,值可以是任意类型。当键含有特殊字符时需使用''引号,访问时也要使用[“abc-abc”]。

      检查对象是否拥有某一属性使用 in操作符  'name' in xiaoming; //true,如果这个属性是xiaoming原型链中的属性,也会返回true。检测自身属性时使用xiaoming.hasOwnProperty('name');。

    Map和Set:Map和Set是ES6新引入的数据类型,Map是一组键值对数据结构,有极快的查找速度。Set只储Value,并且不能重复。

    //声明map
    var map = new Map([['name', 'xiaoming'], ['age', 11]]);
    //
    var map2 = new Map();
    map2.set('name', 'xiaoming');
    //map2.delete('name'); console.log(map2.get(
    'xiaoming'));
    //声明set
    var set = new Set([1,2,'2']);
    //
    var set2 = new Set();
    set2.add(1);
    set2.delete(2);

    iterable:Array可以使用下标循环,但Map和Set就不行了,所以ES6标准引入了iterable类型,Array,Map,Set都是iterable类型,iterable类型可以使用for...of循环。

    var a = [1,2,3];
    var b = new Map(['a', 1], ['b', 2]);
    var c = new Set([1,2,3]);
    for(var item of c)
    {
      console.log(item[0] + ',' +  item[1]);  
    }

    for in和for of:for in遍历的是对象的属性名称,for of仅遍历集合本身的元素。

    forEach:iterable有forEach方法,接受一个回调函数,每次迭代都会调用回调函数。

    var a = [1,2,3];
    a.forEach(function(element, index, array)
    {
        //element是当前元素值
        //当前索引
        //数组本身
    });
    var s = new Set(['A', 'B', 'C']);
    s.forEach(function (element, sameElement, set) {
        console.log(element);
    });
    var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
    m.forEach(function (value, key, map) {
        console.log(value);
    });

    函数:声明函数function a(){}或使用var a = function(){}声明一个匿名函数并将匿名函数赋值给变量a。

    rest参数:ES6中引入了rest参数 function a(x, y, ...rest){},xy以外的参数以数组的形式赋值给rest。如果参数不够,rest是一个空数组。

    变量提升:js函数有一个特点是函数内部声明的变量都会提升到顶部,注意是声明提升,而赋值不会提升。未赋值的变量是undefined。

    变量作用域:在函数内部声明的变量仅作用于函数内部。不在函数内部声明的变量具有全局作用域,相当于全局对象window的一个属性。

    局部作用域:在for语句块中是无法定义具有局部作用域变量的,所以ES6引入了let,let可以声明一个块级作用域的变量。

    常量:ES6引入了const关键字来定义常量,const和let一样具有块级作用域。

    解构赋值:ES6引入了解构赋值,可以同时对一组变量进行赋值。

    var list = [1,2,3];
    var [x,y,z] = list;//分别给xyz赋值123.
    var person = {
        name: '小明',
        age: 20,
        gender: 'male',
        passport: 'G-12345678',
        school: 'No.4 middle school'
    };
    var {name, age, passport} = person;

    方法:在对象中绑定一个函数,称为这个对象的方法。

    this:方法内部可以使用this关键字,指向调用方法的对象。如果不通过对象调用函数,在strict模式下this指向undefined,非strict模式下this指向window。方法内部的函数中的this指向window或undefined。

    apply:可以使用函数的apply方法来控制this的指向,func.apply(obj, []);func函数中this指向obj。call()和apply()类似,唯一不同的是apply是把参数放到数组中再传入,而call可以直接接受多个参数。对于一般函数Math.max.call(null, 1,2,3); 第一个参数传入null即可。

    高阶函数:一个函数接受另一个函数作为参数,称为高阶函数。

    map/reduce:map是定义在Array中的高阶函数,可以传入自定义函数作为参数,从而返回一个新的数组。reduce接受的函数必须有两个参数,其效果相当于[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    //对一个Array求和,就可以用reduce实现:
    var arr = [1, 3, 5, 7, 9];
    arr.reduce(function (x, y) {
        return x + y;
    }); // 25

    filter/sort:这两个也是定义在Array中的高阶函数,filter接收一个函数,依次作用于每个元素,然后根据返回的是true还是false决定是否保留元素。

    // 保留偶数
    var list = [1,2,3,4,5];
    var arr = list.filter(function(x){
        return x%2===0;
    });
    // [2,4]

    sort接收一个排序函数,并且直接对原数组进行修改。

    //倒序排序,我们可以把大的数放前面:
    var arr = [10, 20, 1, 2];
    arr.sort(function (x, y) {
        if (x < y) {
            return 1;
        }
        if (x > y) {
            return -1;
        }
        return 0;
    }); // [20, 10, 2, 1]

    闭包:一个函数a()内部的函数b()引用了函数a()内部的局部变量,并且函数a()返回内部函数b(),返回的函数引用着函数a()的局部变量,这就形成了闭包。换句话说,闭包就是携带状态的函数,并且状态对外隐藏。

    箭头函数:ES6新增了箭头函数 x=>x+x;,相当于匿名函数,但有个显著的区别就是this的指向,箭头函数内部的this是词法作用域,由上下文决定。

    var obj = {
        birth: 1990,
        getAge: function () {
            var b = this.birth; // 1990
            var fn = function () {
                return new Date().getFullYear() - this.birth; // this指向window或undefined
            };
            return fn();
        }
    };
    
    var obj = {
        birth: 1990,
        getAge: function () {
            var b = this.birth; // 1990
            var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
            return fn();
        }
    };
    obj.getAge(); // 25
    
    //由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者
    //apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被
    //忽略:
    var obj = {
        birth: 1990,
        getAge: function (year) {
            var b = this.birth; // 1990
            var fn = (y) => y - this.birth; // this.birth仍是1990
            return fn.call({birth:2000}, year);
        }
    };
    obj.getAge(2015); // 25

    typeof:typeof可以判断对象类型,返回类型的字符串

    typeof 123; // 'number'
    typeof NaN; // 'number'
    typeof 'str'; // 'string'
    typeof true; // 'boolean'
    typeof undefined; // 'undefined'
    typeof Math.abs; // 'function'
    typeof null; // 'object'
    typeof []; // 'object'
    typeof {}; // 'object'

    几条经验总结

    • 不要使用new Number()new Boolean()new String()创建包装对象;

    • parseInt()parseFloat()来转换任意类型到number

    • String()来转换任意类型到string,或者直接调用某个对象的toString()方法;

    • 通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...}

    • typeof操作符可以判断出numberbooleanstringfunctionundefined

    • 判断Array要使用Array.isArray(arr)

    • 判断null请使用myVar === null

    • 判断某个全局变量是否存在用typeof window.myVar === 'undefined'

    • 函数内部判断某个变量是否存在用typeof myVar === 'undefined'

    • 数字转为字符串用
      123..toString(); // '123', 注意是两个点!
      (123).toString(); // '123'

    浏览器对象:js可以获取浏览器提供的很多对象,并对其操作。

    window:window对象不但充当全局作用域,而且表示浏览器窗口。innerWidth和innerHeight表示浏览器内部宽高,是指去掉菜单栏、导航栏后用于显示网页的净宽高。

    navigator:表示浏览器信息,有navigator.appName浏览器名称,navigator.appVersion浏览器版本等属性。

    screen:表示屏幕信息,screen.width表示屏幕宽,单位是像素。

    location:表示当前页面的URL信息,location.href;//http://www.baidu.com,加载一个新的页面用location.assign();。

    document:表示当前页面,由于HTML在浏览器中是DOM形式表示为树形结构,document就是整个DOM树的根节点。

    history:保存了浏览器的历史记录。

  • 相关阅读:
    Atitit 华为基本法 attilax读后感
    Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
    Atitit 项目版本管理gitflow 与 Forking的对比与使用
    Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理
    Atitit 乌合之众读后感attilax总结 与读后感结构规范总结
    深入理解 JavaScript 异步系列(4)—— Generator
    深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
    深入理解 JavaScript 异步系列(2)—— jquery的解决方案
    深入理解 JavaScript 异步系列(1)——基础
    使用 github + jekyll 搭建个人博客
  • 原文地址:https://www.cnblogs.com/ssw-men/p/10647286.html
Copyright © 2011-2022 走看看