//不會一個個知識點的記筆記,只去記錄一些比較坑的點或者比較特別的點
1、三個基本概念(變量、值、類型)
*變量沒有類型,值有類型
2、變量聲明關鍵詞:
let ,
var,
const(使用const時,會使變量和值之間的引用關係不能再改變。而js中的原子值無法改變)
3、類型:7種(symbol ,null ,undefined ,number ,string ,object(非原子類型) , boolean )
4、typrof :查看變量類型
typeof 的三種例外:
null:object
被聲明,未賦值,undefined
typeofa(未被聲明的,不會報錯,只會返回undefined)
5、number(8個字節,64位)
控制有效位
toFixed()//小數點後
toPrecision()//有效位
//一個奇怪的地方0.1+0.2(可以用Number.EPSILON)
NaN(不與任何值相等,包括自己)
Number.MAX_VALUE(當超過後,會靠近最接近的數)
Infinity(無窮大)
+0-0(如何區分;==0&&/Ifinity==Infinity)
Object.is(a,b)//甚至可以區分0,-0,NaN
eg:var a = NaN,
b = NaN;
console.log(Object.is(a, b))
判斷整數:Number.isInteger(61)//判斷一個數是不是整數
6、String類型(16個無符號整形)
一些方法:
concat:連接
indexOf:返回一個子字符串
charAt:獲取指定位置的字符
[]簡寫模式
length:長度
toUpperCase:大寫
聲明後,就不再改變//變了,就不是自己了
使用雙引號
轉義:\
'""'
模板字符串(不需要轉義):``
let a='dads\nfdf'
let b=`dadas
fas`
使用變量: ${a+b}
let c=`我想要知道${a+b}`
7、object類型
1)創建
對象字面量、constructor
對象字面量
let o={
name:'da',
age:18
}
constructor
let o =new Object()
o.name=’malin’
o.age=18
2)訪問value
obj.key//點操作符
obj[key] //括號
//第二種使用更廣一些,比如key中間有空格,但是囉嗦
3)刪除 delete
4)ES6中提供更簡單的方式
letname = 'nalin'
letage = 11
letperson = {
name,
age
}
console.log(person)
8、build-in object(boolean string number)//封裝好的原生方法
**使用constructor,絕大多數都需要new
**自動裝箱、自動拆箱
如果build-in不加new時,實現強制類型轉換
1)封裝了boolean的object的一個奇怪特性,object是一種像是真的值,取反會變成假
let a = new Boolean(false)
if (!a) {
console.log(1111);
} else {
console.log(222222);
}
9、array
1)創建
var a = [0, 1]
a[3] = 1
console.log(a)//會有空洞
2)方法:push
pop
unshift
shift
splice(a,b)//刪了a-b之間的東西
splice(a,b,‘a’,‘da’)//刪了a-b之間的東西,然後把後面的添加進去(如果放入的數據多於刪掉的,會將之後的佔用)
slice(a,b)切片
length:改變length可以截斷數組
強制類型轉換後爲false:共6種
“N0fun”
N:NaN
0:
false:
undefined:
n:null
""
####################################################################################################################################
array的一些方法:
poppush
shuiftunshift
splice:刪除
slice(start,end)
複製數組:ab=a.slice()
一些build_in objects
function
1)創建:
聲明: function fun(){}
函數表達式:var f=function(){}
箭頭函數:()=>{}
new(不建議用)
函數聲明:
參數:各種奇怪,
可選
函數表達式:函數名可選
箭頭函數:
參數爲一:括號變成可選
let person={
say(){
console.log('hello')
}
}
10、symbol類型:(提供一種與存儲無關的方式來表達一個符號)
動機:爲對象加入 private屬性
創建:
let my=Symbol('sdada');不需要,也不能使用new
返回的是原子類型,而不是
letmys=Symbbol('dada')
letmobj=Object(mys)
letobj={}
obj[my]='dadadas'
使用:symbol1==symbol symbol1!=symbol2(兩次調用,不可能返回同一個值)
共享 symbol 類型的值
es6全局註冊表
lets=Symbol.for('sdada')//查找是否存在,存在?不存在就創建
11、prototype:原型
每個obj關聯僅關聯一個Prototype
prototype本身必須是一個object或者null
內部狀態:放在一個槽中
對象之間通過原型關係,形成原型鏈
一個object包含:
三部分 :
properties:完全控制權
internalslots:內部槽 (無法增加或減少槽數,但是可以改變)
internalmethods:(無法改變
原型鏈:
創建時關聯:
letobj=Object.create(proto)
創建後關聯:
Object.setPrototypeOf(obj,proto)
優點:動態性更強//像其他語言的繼承,可以具有多態性***但是不可以重載
如何查找key:向上查找,沒有的話,返回undefined
12、變量作用域:
程序主函數
Global object(全部對象)
NaN,undefined都是一個key
全局對象:
值屬性:Infinity,NaN ,undefined…
函數屬性:isNaN(number),eval(x),parseFloat(string) …
構造函數屬性:Array,Boolean, String, Number…
其他屬性:Math,JSON…
邪惡特性:
全局(如果聲明變量的時候,什麼都不用)
全局變量不是變量
解決方法:
"usestrict";
a=1
console.log('hello')
變量作用域:
var函數作用域
//微編譯
變量提升(只把聲明提升到最前面)
局部變量會這樣,函數也會這樣
****變量提升只提升函數名 而函數提升會提升整個函數體 注意:函數提升在變量提升上面。