JS基礎(chǔ)

function User() {}
User.prototype = {
  lessons: ["JS", "VUE"]
};
const lisi = new User();
const wangwu = new User();

lisi.lessons.push("CSS");

console.log(lisi.lessons); //["JS", "VUE", "CSS"]
console.log(wangwu.lessons); //["JS", "VUE", "CSS"]
undefined:未賦值與未定義的變量值都為 undefined
null: 用于定義一個(gè)空對(duì)象缩搅,即如果變量要用來(lái)保存引用類型并齐,
可以在初始化時(shí)將其設(shè)置為null
  • 標(biāo)簽(label) 為程序定義位置窗声,可以使用continue/break跳到該位置
continue hdcms: 跳出n的循環(huán)
break houdunren:  跳出I的循環(huán)
houdunren: for (let i = 1; i <= 10; i++) {
  hdcms: for (let n = 1; n <= 10; n++) {
    if (n % 2 != 0) {
      continue hdcms;
    }
    console.log(i, n);
    if (i + n > 15) {
      break houdunren;
    }
  }
}
  • for/in 用于遍歷對(duì)象的所有屬性响谓,for/in主要用于遍歷對(duì)象映凳,不建議用來(lái)遍歷數(shù)組
  • for/of 用來(lái)遍歷 Arrays(數(shù)組), Strings(字符串), Maps(映射), Sets(集合)等可迭代的數(shù)據(jù)結(jié)構(gòu)州弟。與 for/in 不同的是 for/of 每次循環(huán)取其中的值而不是索引速挑。
    https://doc.houdunren.com/js/2%20運(yùn)算符與流程控制.html#for-in
  • typeof 用于判斷數(shù)據(jù)的類型
let a = 1;
console.log(typeof a); //number

let b = "1";
console.log(typeof b); //string

//未賦值或不存在的變量返回undefined
var hd;
console.log(typeof hd);

function run() {}
console.log(typeof run); //function

let c = [1, 2, 3];
console.log(typeof c); //object

let d = { name: "houdunren.com" };
console.log(typeof d); //object
  • instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上暇咆。也可以理解為是否為某個(gè)對(duì)象的實(shí)例锋爪,typeof不能區(qū)分?jǐn)?shù)組,但instanceof則可以爸业。
let hd = [];
let houdunren = {};
console.log(hd instanceof Array); //true
console.log(houdunren instanceof Array); //false

let c = [1, 2, 3];
console.log(c instanceof Array); //true

let d = { name: "houdunren.com" };
console.log(d instanceof Object); //true

function User() {}
let hd = new User();
console.log(hd instanceof User); //true
  • NaN 表示無(wú)效的數(shù)值其骄,下例計(jì)算將產(chǎn)生NaN結(jié)果
console.log(Number("houdunren")); //NaN
console.log(2 / 'houdunren'); //NaN
  • Date 網(wǎng)站中處理日期時(shí)間是很常用的功能
有new沒(méi)有new的區(qū)別
let now = new Date();
console.log(now);
console.log(typeof date); //object
console.log(now * 1); //獲取時(shí)間戳

//直接使用函數(shù)獲取當(dāng)前時(shí)間
console.log(Date());
console.log(typeof Date()); //string

//獲取當(dāng)前時(shí)間戳單位毫秒
console.log(Date.now());
  • slice (start,end) 截取數(shù)組
    start 參數(shù)開(kāi)始的元素,并在給定的 end 參數(shù)處結(jié)束扯旷,但不包括拯爽。
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1, 3);
  • 清空數(shù)組
1. user = [];
2. user.length = 0;
3. user.splice(0, user.length);
4.while (user.pop()) {} 使用pop/shift刪除所有元素,來(lái)清空數(shù)組
  • 連接兩個(gè)或多個(gè)數(shù)組
let array = ["hdcms", "houdunren"];
let hd = [1, 2];
let cms = [3, 4];
console.log(array.concat(hd, cms)); //["hdcms", "houdunren", 1, 2, 3, 4]
---------------------------------------------------------------
console.log([...array, ...hd, ...cms]);
---------------------------------------------------------------
array.copyWithin(target, start, end)
  • 查找元素
1.indexOf 查找字符串將找不到钧忽,因?yàn)閕ndexOf 類似于===是嚴(yán)格類型約束毯炮。
let arr = [7, 3, 2, '8', 2, 6];
console.log(arr.indexOf(8)); // -1

2.lastIndexOf

3.使用 includes 查找字符串返回值是布爾類型更方便判斷 使用includes等不能查找引用類型,因?yàn)樗鼈兊膬?nèi)存地址是不相等的

4.find 方法找到后會(huì)把值返回出來(lái)
let arr = ["hdcms", "houdunren", "hdcms"];
let find = arr.find(function(item) {
  return item == "hdcms";
});
console.log(find); //hdcms

5.findIndex 返回下標(biāo)
let arr = [7, 3, 2, '8', 2, 6];
console.log(arr.findIndex(function (v) {
    return v == 8;
})); //3
  • reduce 使用 reducereduceRight
    https://doc.houdunren.com/js/4%20數(shù)組類型.html#reduce
  • symbol
    1.Symbol 不能使用 for/in耸黑、for/of 遍歷操作
    2.可以使用 Object.getOwnPropertySymbols 獲取所有Symbol屬性
    3.也可以使用 Reflect.ownKeys(obj) 獲取所有屬性包括Symbol
    let user1 = {
      name: '李四',
      key: Symbol()
    }
    let user2 = {
      name: '李四',
      key: Symbol()
    }
    let grade = {
      [user1.key]: { js: 100, css: 90 },
      [user2.key]: { js: 900, css: 90 },
    };
    console.table(grade);
    console.table(grade[user1.key]);

image.png

https://doc.houdunren.com/js/5%20Symbol.html#緩存操作

  • Set
    用于存儲(chǔ)任何類型的唯一值桃煎,無(wú)論是基本類型還是對(duì)象引用。
    只能保存值沒(méi)有鍵名
    嚴(yán)格類型檢測(cè)如字符串?dāng)?shù)字不等于數(shù)值型數(shù)字
    值是唯一的
    遍歷順序是添加的順序大刊,方便保存回調(diào)函數(shù)
  • WeakSet
    1为迈、結(jié)構(gòu)同樣不會(huì)存儲(chǔ)重復(fù)的值,它的成員必須只能是對(duì)象類型的值。
    2葫辐、WeaSet弱引用
    保存的對(duì)象不會(huì)增加引用計(jì)數(shù)器搜锰,如果一個(gè)對(duì)象不被引用了會(huì)自動(dòng)刪除。
    因?yàn)槭侨跻?所以也沒(méi)有循環(huán)便厲的方法
下例中的數(shù)組被 arr 引用了另患,引用計(jì)數(shù)器+1
數(shù)據(jù)又添加到了 hd 的WeaSet中纽乱,引用計(jì)數(shù)還是1
當(dāng) arr 設(shè)置為null時(shí),引用計(jì)數(shù)-1 此時(shí)對(duì)象引用為0
當(dāng)垃圾回收時(shí)對(duì)象被刪除昆箕,這時(shí)WakeSet也就沒(méi)有記錄了
  • classList 給元素添加類
    元素.classList.add('');
  • this 使用嚴(yán)格模式時(shí)在全局函數(shù)內(nèi)this為undefined
var hd = '后盾人';
function get() {
  "use strict"
  return this.hd;
}
console.log(get());
//嚴(yán)格模式將產(chǎn)生錯(cuò)誤 Cannot read property 'name' of undefined
  • 對(duì)象字面量
    下例中的hd函數(shù)不屬于對(duì)象方法所以指向window
    show屬于對(duì)象方法執(zhí)向 obj對(duì)象
let obj = {
  site: "后盾人",
  show() {
    console.log(this.site); //后盾人
    console.log(`this in show method: ${this}`); //this in show method: [object Object]
    function hd() {
      console.log(typeof this.site); //undefined
      console.log(`this in hd function: ${this}`); //this in hd function: [object Window]
    }
    hd();
  }
};
obj.show();
  • 在方法中使用函數(shù)時(shí)有些函數(shù)可以改變this如forEach
let Lesson = {
  site: "后盾人",
  lists: ["js", "css", "mysql"],
  show() {
    return this.lists.map(function(title) {
      return `${this.site}-${title}`;
    }, this);
  }
};
console.log(Lesson.show());//['后盾人-js', '后盾人-css', '后盾人-mysql']
  • 在父作用域中定義引用this的變量
let Lesson = {
    site: "后盾人",
    lists: ["js", "css", "mysql"],
    show() {
      const self = this;
      return this.lists.map(function(title) {
        return `${self.site}-${title}`;
      });
    }
  };
  console.log(Lesson.show());
    // call是一個(gè)方法 函數(shù)的方法
    Function.prototype.newCall = function (context) {
     //1. 找到未來(lái)this的指向鸦列,即arguments[0], 如果沒(méi)有傳入任何參數(shù) 那么我們將this指向window
     //如果傳入的類型是string number boolean 我們要對(duì)其進(jìn)行包裝
     var target = Object(arguments[0])||window
     //2.找到未來(lái)要執(zhí)行的函數(shù) 并且改變其this的指向 相當(dāng)于把this這個(gè)未來(lái)要執(zhí)行的函數(shù)放在target對(duì)象里面 讓函數(shù)成為對(duì)象的一部分
     target.fn = this;
     //4.把a(bǔ)rguments[0]以外的參數(shù) 傳入函數(shù) 并且執(zhí)行該函數(shù)
     var params = [];
     for(var i = 1; i< arguments.length; i++){
       params.push(arguments[I]);
     } 
     //var result = target.fn (...params)
     var result = eval('target.fn('+params.toString()+')');
     //5.刪除目標(biāo)對(duì)象的函數(shù)
     delete target.fn
     return result
    };
    let obj = {
      name: "Jowie",
    };
    function addAge(age,test) {
      this.age = age;
      console.log(this);
      return this;
    }
    addAge.newCall(obj,20,30)
Function.prototype.myApply =function(context,arr){
context = Object(context) || window;
context.fn = this;
var result;
if(!arr){
    result= context.fn();
}else{
    var args = [];
    for(var i=0;i<arr.length;i++){
        args.push('arr['+i+']');
    }
    result = eval('context.fn('+args.toString()+')')
}
delete context.fn;
return result;
}

var q = {name:'chuchu'};
var arg1 = 1;
var arg2= [123]
function eat(n,m){
    console.log(this,n,m);
}
eat.myApply(q,[arg1,arg2])
//bind方法,是改變當(dāng)前調(diào)用bind方法的函數(shù)this指向鹏倘,但是不會(huì)立即執(zhí)行當(dāng)前函數(shù)薯嗤,而是返回一個(gè)新的函數(shù)。并且支持給新的函數(shù)傳入?yún)?shù)執(zhí)行纤泵,從而出發(fā)之前調(diào)用bind方法的函數(shù)執(zhí)行骆姐,并且參數(shù)透?jìng)鬟M(jìn)去。bind方法是高階函數(shù)的一種
Function.prototype.myBind = function(){
var context = arguments[0];
var self = this;
return function (){
    self.myApply(context,arguments)
}
};
var j = {name:1};
var k = [123]
function drink (k){
    console.log(this.name,k);
}
var fn = drink.myBind(j);
fn(k);
  • 對(duì)象是否包含一個(gè)屬性 obj.hasOwnProperty
  • 使用in 可以在原型對(duì)象上檢測(cè)
let obj = {name: "后盾人"};
let hd = {
  web: "houdunren.com"
};
//設(shè)置hd為obj的新原型
Object.setPrototypeOf(obj, hd);
console.log(obj);
console.log("web" in obj); //true
console.log(obj.hasOwnProperty("web")); //false
  • 使用系統(tǒng)提供的API可以方便獲取對(duì)象屬性與值
const hd = {
  name: "后盾人",
  age: 10
};
console.log(Object.keys(hd)); //["name", "age"]
console.log(Object.values(hd)); //["后盾人", 10]
console.table(Object.entries(hd)); //[["name","后盾人"],["age",10]]
Object.getOwnPropertyNames(hd)//["name", "age"]
  • Object.assign 函數(shù)可簡(jiǎn)單的實(shí)現(xiàn)淺拷貝捏题,它是將兩個(gè)對(duì)象的屬性疊加后面對(duì)象屬性會(huì)覆蓋前面對(duì)象同名屬性玻褪。
let user = {
    name: '后盾人'
};
let hd = {
    stu: Object.assign({}, user)
};
hd.stu.name = 'hdcms';
console.log(user.name);//后盾人
  • 深淺拷貝
1. 淺拷貝僅僅是指向被拷貝的內(nèi)存地址,如果原地址中對(duì)象被改變了公荧,那么淺拷貝出來(lái)的對(duì)象也會(huì)相應(yīng)改變带射。()
2. 我在想如何讓obj1復(fù)制obj的對(duì)象內(nèi)容,在我對(duì)obj1進(jìn)行修改時(shí)循狰,不影響obj窟社。通過(guò)遞歸調(diào)用淺拷貝來(lái)解決。
//深拷貝 實(shí)現(xiàn)
        function deepCopy(obj){
            let temp = obj.constructor === Array?[]:{};
            for(let val in obj){
                temp[val] = typeof obj[val] == 'object' ? deepCopy(obj[val]) : obj[val];
            }
            return temp;
        }
        console.log(deepCopy(obj));
  • 屬性特征
使用 Object.getOwnPropertyDescriptor查看對(duì)象屬性的描述
使用Object.defineProperty 方法修改屬性特性
Object.preventExtensions 禁止向?qū)ο筇砑訉傩?Object.isExtensible 判斷是否能向?qū)ο笾刑砑訉傩?Object.seal()方法封閉一個(gè)對(duì)象绪钥,阻止添加新屬性并將所有現(xiàn)有屬性標(biāo)記為 configurable: false
Object.freeze 凍結(jié)對(duì)象后不允許添加灿里、刪除、修改屬性程腹,writable匣吊、configurable都標(biāo)記為false

https://doc.houdunren.com/js/10%20對(duì)象.html#屬性特征

  • 代理攔截(不會(huì))
    https://doc.houdunren.com/js/10%20對(duì)象.html#閉包訪問(wèn)器
  • 序列化JSON.stringify
    序列化是將 json 轉(zhuǎn)換為字符串
    為數(shù)據(jù)添加 toJSON 方法來(lái)自定義返回格式
    反序列化
    使用 JSON.parse 將字符串 json 解析成對(duì)象
let hd = {
    "title": "后盾人",
    "url": "houdunren.com",
    "teacher": {
        "name": "向軍大叔",
    },
    "toJSON": function () {
        return {
            "title": this.url,
            "name": this.teacher.name
        };
    }
}
console.log(JSON.stringify(hd)); //{"title":"houdunren.com","name":"向軍大叔"}
  • mixin
    JS不能實(shí)現(xiàn)多繼承,如果要使用多個(gè)類的方法時(shí)可以使用mixin混合模式來(lái)完成
const Tool = {
  max(key) {
    return this.data.sort((a, b) => b[key] - a[key])[0];
  }
};
class Lesson {
  constructor(lessons) {
    this.lessons = lessons;
  }
  get data() {
    return this.lessons;
  }
}
Object.assign(Lesson.prototype, Tool);
const data = [
  { name: "js", price: 100 },
  { name: "mysql", price: 212 },
  { name: "vue.js", price: 98 }
];
let hd = new Lesson(data);
console.log(hd.max("price"));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甸祭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褥影,老刑警劉巖池户,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡校焦,警方通過(guò)查閱死者的電腦和手機(jī)赊抖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寨典,“玉大人氛雪,你說(shuō)我怎么就攤上這事∷食桑” “怎么了报亩?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)井氢。 經(jīng)常有香客問(wèn)我弦追,道長(zhǎng),這世上最難降的妖魔是什么花竞? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任劲件,我火速辦了婚禮,結(jié)果婚禮上约急,老公的妹妹穿的比我還像新娘零远。我一直安慰自己,他們只是感情好厌蔽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布牵辣。 她就那樣靜靜地躺著,像睡著了一般躺枕。 火紅的嫁衣襯著肌膚如雪服猪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天拐云,我揣著相機(jī)與錄音罢猪,去河邊找鬼。 笑死叉瘩,一個(gè)胖子當(dāng)著我的面吹牛膳帕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播薇缅,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼危彩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泳桦?” 一聲冷哼從身側(cè)響起汤徽,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灸撰,沒(méi)想到半個(gè)月后谒府,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拼坎,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年完疫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泰鸡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壳鹤,死狀恐怖盛龄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芳誓,我是刑警寧澤余舶,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站兆沙,受9級(jí)特大地震影響欧芽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葛圃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一千扔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧库正,春花似錦曲楚、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至喷楣,卻和暖如春趟大,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铣焊。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工逊朽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人曲伊。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓叽讳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坟募。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岛蚤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 15、正則 正則就是一個(gè)規(guī)則懈糯,用來(lái)處理字符串的規(guī)則1涤妒、正則匹配編寫一個(gè)規(guī)則,驗(yàn)證某個(gè)字符串是否符合這個(gè)規(guī)則赚哗,正則匹...
    萌妹撒閱讀 1,439評(píng)論 0 1
  • 一蜂奸,數(shù)據(jù)類型 1犁苏,基本數(shù)據(jù)類型(值類型): number,string扩所,boolean围详,null,undefine...
    L_ven閱讀 657評(píng)論 0 0
  • JS的單線程模型和事件循環(huán)機(jī)制 JS的單線程模型意味著祖屏,在執(zhí)行JS時(shí)只有一個(gè)主線程助赞,每個(gè)任務(wù)必須順序執(zhí)行。如果當(dāng)前...
    hyy_1754閱讀 398評(píng)論 0 0
  • 27袁勺、移動(dòng)端響應(yīng)式布局開(kāi)發(fā) 響應(yīng)式布局開(kāi)發(fā) 1雹食、什么是響應(yīng)式布局開(kāi)發(fā)?把我們開(kāi)發(fā)完成的產(chǎn)品期丰,能夠讓其適配不同的設(shè)備...
    萌妹撒閱讀 1,044評(píng)論 0 0
  • Vue.js是什么 Vue.js(讀音 /vju?/, 類似于 view) 是一套構(gòu)建用戶界面的 漸進(jìn)式框架群叶。與其...
    魚魚吃貓貓閱讀 3,258評(píng)論 1 12