var a=1||2;//先驗證1真假、爲真給a賦值1
複製代碼
var a=1&&2; //先驗證1真假、爲真給a賦值二、爲假給a
賦值1
複製代碼
<ul id="list">
<li>88</li>
<li>90</li>
<li>78</li>
<li>86</li>
<li>92</li>
</ul>
<button id="btn">排序</button>
<script>
var oLis = document.getElementsByTagName("li");
btn.onclick= function () {
var li = document.createElement("li");
li.innerHTML=100;
ul.appendChild(li);
console.log(oLis);
}
// 輸出6個li;瀏覽器會對li集合進行實時監聽
//當頁面中li個數發生變化那麼此集合也會隨着發生改變
</script>
複製代碼
myFunction(5);
function myFunction(y) {
return y * y;
}
複製代碼
function myFunction(a, b) {
return a * b;
}
var x = myFunction(4, 3);
//x就等於函數運算的結果
//x=12;
複製代碼
function myFunction(a, b) {
return arguments.length;
}
document.getElementById("demo").innerHTML = myFunction(4, 3) //2
複製代碼
function myFunction(a, b) {
return a * b;
}
var txt = myFunction.toString()
複製代碼
x = findMax(1, 123, 500, 115, 44, 88);
function findMax() {
var i, max = arguments[0];
if(arguments.length < 2) return max;
for (i = 0; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
複製代碼
<script>
var myObject, myArray;
myObject={
name: "hahaha ",
hsk: "en"
};
function myFunction(a, b) {
alert(this);
return this.name +this.hsk;
}
myArray = [10, 2]
myObject = myFunction.apply(myObject, myArray)
複製代碼
//類數組轉數組
function sum(){
var ary=[].slice.call(arguments);
}
sum(1,2,33,88,56,88,92)
console.log(ary);
複製代碼
try catchhtml
try{
console.log(a);
}catch(w){
w是一個對象
console.log(w.message);//w是錯誤信息
throw new Error(w.message);//拋出異常信息;此行代碼下面都不運行
console.log(200);
console.log(100);
}
複製代碼
var myStr = "Bob";
myStr[0]="j"
var myStr = "Bob";
myStr = "Job";
複製代碼
var sTr="wdaefaegg";
var s=sTr[sTr.length-1]
複製代碼
typeof只能監測基本數據類型和function
instanceof 檢測某個實例是否屬於這個類,是返回true/不是返回false
用字面量建立的基本數據類型的值檢測不了
只要類在實例的原型鏈上都返回true
constructor 原型上的一個屬性,指向原型上所屬的類
實例.constructor===類
Object.prototype.toString.call
全部數據類型均可以檢測
複製代碼
代碼執行以前進行變量聲明,可是不進行提高java
變量名不能重名數組
一、obj.屬性名瀏覽器
二、obj[「屬性名」]bash
一、obj.已有屬性名=值閉包
二、obj[「已有屬性名」]=值app
一、obj.新增屬性名=值函數
二、obj[「新增屬性名」]=值ui
一、delete obj.屬性名this
二、delete obj[「屬性名」]
var reg=/abc/g; //字面量建立正則
//構造函數建立正則 ("正則的主題","修飾符")
var reg1=new RegExp("abc","g");
var str="abcDABCD"
str.replace(/cd/ig, "-");
//正則修飾符能夠疊加到一塊寫
複製代碼
一、若是變量只聲明,沒有賦值,那麼默認存儲的值就是undefined
var c;
console.log(c);
二、若是獲取對象的屬性名對應的屬性值,若是屬性值名不存在,獲取的值是undefined
三、若是函數的形參沒有對應的實參,那麼形參默認儲存值是undefined
四、若是函數沒有return,那麼默認值的返回值也是undefined
複製代碼
返回值爲null的狀況:
一、經過Id獲取元素的時候,獲取不到返回null
二、銷燬對象時,給他賦值爲null
三、正則捕獲對象時(reg.exec()),沒有捕獲到內容,返回null
NaN 和本身都不相等
對象先轉字符串,再轉數字,布爾轉數字
比較的是空間地址
對象先轉字符串,再轉數字
對象轉字符串,字符串比較
布爾轉數字,字符串轉數字
布爾轉數字
字符串轉數字
造成全局做用域---> 變量提高(var、function)--> 代碼從上到下執行
無論條件是否成立,都要進行變量提高
在最新版本的瀏覽器中,對function函數,只聲明不定義
在舊版本瀏覽器中,帶function的不只聲明,還要定義
in : 檢測屬性名是否屬於這個對象;若是屬於返回true,不屬於返回false
變量提高只發生等號的左邊
return下面的代碼須要進行變量提高;可是return後面的代碼不進行變量提高
return : 1. 返回值 2. 停止代碼再也不向下運行
若是變量重複,不須要從新聲明,可是要從新定義
匿名函數不須要進行變量提高
當獲取變量對應值時,若是當前做用域不存在,須要向上一級做用域查找
函數的上一級做用域跟函數在哪執行沒有關係==跟函數在哪定義有關,函數在哪一個做用域下定義,上一級做用域就是誰 全部做爲值類型的都是數據類型中的一種
在JS中只要遇到報錯,代碼當即中止,再也不向下執行
私有做用域中帶war的是私有變量、不帶war的不是私有變量它會向上級做用域查找
在做用域鏈查找的過程當中、若是找到win也沒有這個變量、至關於給win設置屬性
function fn(){
b=13;
console.log(b);
}
fn();
console.log(b);
複製代碼
在js變量提高代碼運行時、當條件成立、進入判斷體中(在ES6中、它是一個塊級做用域)、先把fn聲明和定義了、也就是判斷體中代碼執行以前、fn就賦值了、
在塊級做用域下、帶war的和function的不能夠重名
函數有形參沒實參始終是undefined
指js中有特定意義的關鍵字
一、全局做用域下的this指向window、和window是同一個空間地址
console.log(this);
console.log(window);
this.a=1
複製代碼
二、若是給元素的事件行爲綁定函數、那麼函數中的this指向當前被綁定的那個元素
oBox.onclick=function(){
console.log(this);//this---oBox}
複製代碼
三、函數中的this、要看函數執行前有沒有「.」、有的狀況下this就指向誰、沒有就指向window
四、自執行函數中的this永遠指向window
五、定時器中函數的this指向window
六、構造函數中的this指向當前的實例
七、call、apply、bind能夠改變函數中this的指向
在js中let不存在變量提高、let執行時會造成私有做用域
let在相同做用域中、let不能聲明相同名字變量、有重名直接報錯
無論什麼方式在當前做用域下聲明瞭變量==、再次==使用let建立都會報錯
在原有瀏覽器渲染機制下、基於typeof等邏輯運算符檢測一個未被聲明的變量、不會報錯、返回undefined
若是當前變量是基於ES6語法處理、在沒有聲明這個變量時、使用typeof檢測則直接報錯、不是undefined、這樣解決了暫時性死區
1.函數執行前造成一個私有做用域、代碼執行以前默認建立空的對象
2.而且改變了當前做用域下的this指向、讓其指向那個空對象
3.當代碼運行完、把這個對象返回
普通函數和構造函數
經過new這種方式建立一個數組
var f=new Array(12,12)
console.log(f);
//若是隻有一個參數,表明數組的長度
// 不是一個參數就表明數組成員的每一項
複製代碼
在嚴格模式下arguments和形參沒有映射機制
在嚴格模式下不容許給一個對象設置重複屬性名的
obj={n:10,n:20}
複製代碼
在嚴格模式下、函數執行、若是沒有明確指定執行的主體(函數前面沒有點)再也不像非嚴格模式下、統一交給window、而是讓this指向undefined、表明沒有執行主體
嚴格模式下、有執行主體this就指向誰、沒有執行主體、this就是undefined
詳見高程三 嚴格模式和非嚴格模式的彙總
2.若是沒有參數,能夠省略小括號;
3.若是return一個基本數據類型的值,不會覆蓋默認返回的那個對象,若是return引用的類型,會將默認的那個覆蓋掉;
4.instanceof :檢測實例是否屬於某個類;
5.hasOwnProperty:檢測當前屬性是不是私有屬性,若是是返回true,不是返回false
console.log(d.hasOwnProperty("a"));//true
console.log(d.hasOwnProperty("toString"));//false
console.log(d.hasOwnProperty("c"));// false
複製代碼
封裝檢測是否數據類型屬於私有屬性仍是公有屬性
function hasPublicProperty(obj,attr) {
return attr in obj && !obj.hasOwnProperty(attr)?true:false;}
複製代碼
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.eat=function(){
console.log("Person 吃飯")
}
function Student(num,score){
this.num=num
this.score=score
}
//繼承
Student.prototype=new Person("小紅",10)
Student.prototype.constructor=Student
var stu =new Student(2016002288,80)
stu.eat()//Person 吃飯
複製代碼
function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
Person.prototype.sayHi=function(){
console.log("你好")
}
function Student(name,age,sex,score){
//借用構造函數
Person.call(this,name,age,sex)
this.score=score
}
// 改變了原型指向
Student.prototype=new Person();//不傳值
Student.prototype.eat=function(){
console.log("吃東西");
}
var stu=new Student("小黑",20,"男","100分")
console.log(stu.name,stu.age,stu.sex,stu.score);
stu.sayHi()//你好
stu.eat()//吃東西
複製代碼
在嚴格模式下,若是不傳或傳undefined,那麼this就是undefined 傳null 就是null
只能接收最多兩個參數 和call不一樣的是傳參不一樣
bind 方法的返回值就是改變this以後的fn
分享一波專屬表情包戳我!