javaScript的變量、值與類型

本文主要是奇舞前端特訓營的筆記
https://t.75team.com/video前端

變量

變量聲明的三種方法mysql

1.var-聲明一個變量,可選擇將其初始化爲一個值sql

- 不支持塊級做用域
 - var存在變量提高
console.log(a === undefined) //true
        var a = 10;

2.let-聲明一個塊級做用域變量,可選擇將其初始化一個值瀏覽器

- 塊級做用域
{
    let x = 10;
}
console.log(typeof x); //undefined
- 同一做用域中不容許重複聲明
- 暫存死區
- 循環中的let做用域
- 瀏覽器兼容性

3.const-聲明一個只讀的常量 綁定的值不能夠再次改變ide

類型

ECMAScript語言中全部的值都有一個對應的語言類型。ECMAScript語言類型包括Undefined、Null、Boolean、String、Number和Object。
對語言引擎和開發人員來講,類型是值的內部特徵,它定義了值的行爲,以使其區別於其餘值this

JavaScript有七種內置類型:spa

空值(null
未定義(undefined
布爾值( boolean
數字(number
字符串(string
對象(object
符號(symbol,ES6中新增)
除對象以外,其餘統稱爲「基本類型」。prototype

Boolean
值:true和false
須要注意:0,"", null, undefined, 會被隱式的轉化爲false,其餘都爲truecode

  • 建議採用嚴格比較,能夠經過!!將非boolean轉化爲booleansqlite

  • 比較操做符總會返回boolean

  • 布爾操做符&&和||不會轉化類型

  • &&和||具備短路特性

    console.log(null !== undefined, null == undefined); //true, true
    console.log(1 && 2) //2

Number

  • 數值範圍
    整數-2^53~2^53

    超事後會有精度丟失

    小數精度Number.EPSILON
    Infinity, Number.MAX_VALUE, Number.MIN_VALUE

  • 浮點數精度問題
    console.log(0.2+0.4) //0.6000000000000001
    限制精度

    console.log((0.2+0.4).toFixed(2)); // 0.60

String

  • 引號規範和轉義
    建議使用單引號

  • 字符串類型轉換
    console.log('1'+2, '2'-1);//'12', 1 隱式類型轉化
    字符串模版

Object

  • 對象是個引用類型

  • 值類型和包裝類型
    包裝類型typeof是object

對象的copy

let conf = {
    adapter: 'sqlite',
    db: {
        aqlite: {
            name: 'xxx.sqlite'
        },
        mysql: {
            name: 'xxx',
            username: 'work',
            passwd: '***'
        }
    }
}

// ES6淺拷貝
let copied = Object.assign({}, conf);
copied.adapter = 'mySql';
console.log(conf.adapter); //sqlite
console.log(copied.adapter); //mySql

copied.db.mySql.name = 'yyy.sqlite';
console.log(conf.db.mySql.name); //yyy.sqlite

// 深拷貝
function deepCopy(des, src){
    for( var key in src){
        let prop = src[key];
        if(typeof prop === 'object'){
            des[key] = des[key] || {}; // typeof{} === object
            deepCopy(des[key], src[key]);
        }else {
            des[key] = src[key];
        }
    }
    return des;
}
let deepCopied = deepCopy({}, conf);
deepCopied.db.sqlite.name = 'zzz.sqlite';
// 深拷貝
console.log(deepCopied.db.sqlite.name, conf.db.sqlite.name);//'zzz.sqlite, yyy.sqlite'

對象的類型和構造器

  • new和constructor

    new是一種語法糖

  • prototype

    //原型鏈
    // __proto__暴力構建原型鏈
    var a = {x: 1},b = {y: 2}, c = {z: 3};
    b.__proto__ = a;
    c.__proto__ = b;
    console.log(c);
    
    // 使用Object.create(a)構建原型鏈
    var a = {x: 1};
    var b = Object.create(a);
    b.y = 2;
    var c = Object.create(b);
    c.z = 3;
    console.log(c);
    
    // 使用構造器構建原型鏈
    function A(){
        this.x = 1;
    }
    function B(){
        this.y = 2;
    }
    B.prototype = new A();
    function C(){
        this.z = 3;
    }
    C.prototype = new B();
    var c = new C();
    console.log(c);
    
    // 三種方式都是構建原型鏈

    一張圖片有助於理解

圖片描述

相關文章
相關標籤/搜索