javascript是弱类型语言。即,一个变量可以赋不同数据类型的值。javascript允许变量类型的隐式转换,允许强制类型转换等,如字符串和数值可以自动转化;而强类型语言一般不允许这么做。
在JavaScript里 变量均为对象。当声明一个变量时,就创建了一个新的对象;
基本类型:字符串(String)、数字(number)、布尔(boolean)、对空(Null)、未定义(Undefined)、Symbol(注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。)。
对象类型:对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
let x; // x 为 undefined
let x = 5; // 现在 x 为数字
let x1 = 34.00; // 小数点 也是数字类型
let x = "John"; // 现在 x 为字符串
let x = ["Q", "C", 1, 3]; // 数组 可以直接
let x = {name:'leo', age: 17}; // 对象
let t = function () {} // 函数 function
// 变量类型的隐式转换
let x1 = 5; // 定义时是 typeof x1 number
x1 = 'json'; // 通过赋值string 变成了 typeof x1 string
// 数组定义
let arr = [];
or
let arr = new Array();
cars[0]="Saab"; // 为数组第一项赋值
or
let arr = ["Saab"]
// 对象定义与数组类似
let arr = {};
or
let arr = new Object();
cars['name']="Saab"; // 为对象添加key-value
or
let arr = {name: "Saab"}
变量的数据类型可以使用 typeof
typeof "leo" // 返回 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 数组与对象,null都返回,object
// 如何区分他三呢?
let n = null;
console.log(n === null); // true
// 判断数组
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
// 补充几个判断 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';
}
};
补充let,var,const区别
三者都是定义变量,var/let 定义可变变量,区别在于,var 会变量提升,var允许重复声明,而let不允许重复声明,具体参看下面示例;const 定义不可变变量
//变量提升
console.log(a); // undefined
var a = 13;
var a = 14;
// 相当于
var a; // 只声明没有赋值,默认为undefined
console.log(a);
a = 13;
//不允许重复声明
let a = 12
console.log(a)
let a = 13 // => 此行出错:SyntaxError: Identifier 'a' has already been declared
console.log(a)
var a = 12
let a = 13 // => SyntaxError: Identifier 'a' has already been declared
console.log(a)
let a = 13
var a = 12 // => SyntaxError: Identifier 'a' has already been declared
console.log(a)
// const
const a = 1;
a = 2; // 报错,不可修改const 的值