javascript是弱類型語言。即狰贯,一個(gè)變量可以賦不同數(shù)據(jù)類型的值宝鼓。javascript允許變量類型的隱式轉(zhuǎn)換刑棵,允許強(qiáng)制類型轉(zhuǎn)換等,如字符串和數(shù)值可以自動(dòng)轉(zhuǎn)化愚铡;而強(qiáng)類型語言一般不允許這么做铐望。
在JavaScript里 變量均為對(duì)象。當(dāng)聲明一個(gè)變量時(shí),就創(chuàng)建了一個(gè)新的對(duì)象正蛙;
基本類型:字符串(String)督弓、數(shù)字(Number)、布爾(Boolean)乒验、對(duì)空(Null)愚隧、未定義(Undefined)、Symbol(注:Symbol 是 ES6 引入了一種新的原始數(shù)據(jù)類型锻全,表示獨(dú)一無二的值狂塘。)。
對(duì)象類型:對(duì)象(Object)鳄厌、數(shù)組(Array)荞胡、函數(shù)(Function),還有兩個(gè)特殊的對(duì)象:正則(RegExp)和日期(Date)了嚎。
let x; // x 為 undefined?
let x = 5; // 現(xiàn)在 x 為數(shù)字
let x1 = 34.00; // 小數(shù)點(diǎn) 也是數(shù)字類型
let x ="John";// 現(xiàn)在 x 為字符串
let x = ["Q","C",1,3];// 數(shù)組 可以直接
let x = {name:'leo',age:17};// 對(duì)象
let t =function(){}// 函數(shù) function
// 變量類型的隱式轉(zhuǎn)換
let x1 =5;// 定義時(shí)是 typeof x1? number?
x1 ='json';// 通過賦值string 變成了 typeof x1? string?
?// 數(shù)組定義
let arr = [];
or?
let arr =newArray();
cars[0]="Saab";// 為數(shù)組第一項(xiàng)賦值
or
let arr = ["Saab"]
// 對(duì)象定義與數(shù)組類似
let arr = {};
or
let arr =newObject();
cars['name']="Saab";// 為對(duì)象添加key-value
or
let arr = {name:"Saab"}
變量的數(shù)據(jù)類型可以使用?typeof
typeof "leo"http:// 返回 string
typeof 2.67// 返回 number
typeof true// 返回 boolean
typeof ["Q","C"]// 返回 object
typeof {name:'leo', age:17}// 返回 object
typeof function(){}// 返回 function
typeof null// 返回 object//?
注:typeof 數(shù)組與對(duì)象泪漂,null都返回,object
// 如何區(qū)分他三呢歪泳?
let n =null;
console.log(n ===null);//? true
// 判斷數(shù)組
1萝勤,instanceof?
var arr = [1,2,3,1];
console.log(arr instanceof Array);// true?
2,constructor
var arr = [1,2,3,1];
console.log(arr.constructor=== Array);// true?
3呐伞,Object.prototype.toString
function isArrayFn(o){
return Object.prototype.toString.call(o) ==='[object Array]';
}
var arr = [1,2,3,1];
console.log(isArrayFn(arr));// true
4敌卓,es5 新增Array.isArray()
var arr = [1,2,3,1];
console.log(Array.isArray(arr));// true
// 補(bǔ)充幾個(gè)判斷 null/object/array 的工具類
// 通過 typeof
var getDataType = function(o){
????if(o===null){
????????return'null';? ?
?????} else if (typeof o =='object'){
????????if(typeof o.length =='number'){
????????????return 'Array';? ? ? ?
?????????}else{
????????????return 'Object';? ? ? ? ?
?????????}? ??
????}else{
????????return 'param is no object type';? ?
?????}
}
// 通過instanceof
var getDataType =function(o){
????if(o===null){
????????return'null';? ??
????}
????if(o instanceof Array){
????????return 'Array'
????}else if( o instanceof Object){
????????return'Object';? ??
????}else{
????????return'param is no object type';? ?
?????}
};
補(bǔ)充let,var伶氢,const區(qū)別
三者都是定義變量趟径,var/let 定義可變變量,區(qū)別在于癣防,var 會(huì)變量提升蜗巧,var允許重復(fù)聲明,而let不允許重復(fù)聲明劣砍,具體參看下面示例惧蛹;const 定義不可變變量
//變量提升
console.log(a);// undefined
var a =13;
var a =14;
// 相當(dāng)于
var a;// 只聲明沒有賦值扇救,默認(rèn)為undefined
console.log(a);
a =13;
//不允許重復(fù)聲明
let a =12
console.log(a)
let a =13// => 此行出錯(cuò):SyntaxError: Identifier 'a' has already been declared
console.log(a)
var a =12
let a =13// => SyntaxError: Identifier 'a' has already been declaredconsole.log(a)
let a =13
var a =12// => SyntaxError: Identifier 'a' has already been declaredconsole.log(a)
// const?
const a =1;
a =2;// 報(bào)錯(cuò)刑枝,不可修改const 的值