- Javascript的简单类型包括
1.数字 number
JS不分整型与浮点型
两个浮点数相加,精度不够
2.字符串 string
3.布尔值 boolean
4.null
5.undefined
以上都是简单数据类型
其他都是对象 Function Array
研究一下: 前5个貌似是对象,因为他们拥有方法,但是他们是不可变的?简单数据类型,不是对象?
- var,let,const的区别
1.使用var声明的变量作用于全局当中,并且会将变量提升至所在作用域的最顶端
function person(status) {
if (status) {
var value = "蛙人"
} else {
console.log(value) // undefined
}
console.log(value) // undefined
}
person(false)
if
代码块中的var声明的变量就被提升到了函数的顶端,if
代码块里的都没执行,怎么会提升到顶端了呢?这是因为javaScript引擎,在代码预编译时,javaScript引擎会自动将所有代码里面的var
关键字声明的语句都会提升到当前作用域的顶端, 因此上面的代码就会被解析为下面。
function person(status) {
var value;
if (status) {
value = "蛙人"
} else {
console.log(value) // undefined
}
console.log(value) // undefined
}
person(false)
2.let
声明和var声明用法是一样,都是定义变量,使用let声明的变量没有var那样的变量提升,let声明的变量只在当前作用域中有效。
function person(status) {
if (status) {
let value = "蛙人"
} else {
console.log(value) // 报错
}
console.log(value) // 报错
}
person(false)
var value = "蛙人"
let value = "蛙人" // 报错
// 再来看一下不同作用域的情况
var value = "蛙人" // 全局作用域
if(true) {
let value = "蛙人" // 代码块中声明,毫无影响
}
只有在相同作用域中重复声明变量才会报错
3.const声明指的是常量,常量就是一旦定义完就不能修改的值。还有一点需要注意的是,常量定义必须初始化值,如果不初始化值就会报错。
const value = "蛙人"
const age; // 报错 常量未初始化
4.let与const的区别
const与let也没什么大不同,都是块级作用域,const常量也只会在当前代码块内有效,也不能在当前作用域中重复定义相同的变量,也不存在变量提升。
if (true) {
const name = "蛙人"
}
console.log(name) // 报错 访问不到内部变量
console.log(value) // 报错 const声明的变量也不存在变量提升
const value = "蛙人"
- 对象中的属性值不能为undefined
对象是属性的容器,属性拥有名字和值,名字可以是任意字符串(包括空字符串),而属性值可以是除undefined值之外的任何值
- 对象字面量
var flight = {
airline:"Oceanic",//这几对都是对象字面量,是“名/值”对
number: 815,
departure: {
IATA: "SYD",
time: "2004-09-22 14:55"
},//对象是可以嵌套的
}
- 检索
可以采用在[ ]后缀中括住一个字符串表达式的方式。如果字符串表达式是一个常数,而且它是一个合法的JavaScript标识符而并非保留字,那么也可以用“.”表示法代替。优先用后者
var flight = {
airline: "Oceanic", //这几对都是对象字面量,是“名/值”对
number: 815,
departure: {
IATA: "SYD",
time: "2004-09-22 14:55"
}, //对象是可以嵌套的
}
console.log(flight.airline)//输出Oceanic
- 更新
对象中的值可以通过赋值语句来更新。
如果属性名已经存在于对象中,那么这个属性的值被替换。
如果对象之前没有拥有那个属性名,那么属性就被扩充到该对象中
- 引用
对象通过引用来传递。它们永远不会被拷贝
var x = flight;
x.nickname = 'curly';
var nick = flight.nickname;
//因为x和flight是指向同一个对象的引用,所以nick为"curly"
var a = {}, b = {}, c = {};
//a,b,c每个都引用一个不同的空对象
a = b = c = {};
//a,b,c都引用同一个空对象
- 原型
每个对象都连接到一个原型对象,并且可以从中继承属性,所有通过对象字面量创建的对象都连接到Object.prototype 这个JavaScript中标准的对象
-反射
typeof可以确定属性的类型,hasOwnProperty也可以用来确定属性的类型,但是不会检查原型链
-枚举
for in语句可以用来遍历一个对象中的所有属性名,该枚举过程将会列出所有的属性——包括函数和你可能不关心的原型中的属性,所以可以用hasOwnProperty和typeof来排除函数
var name;
for (name in another_stooge){
if(typeof another_stooge[name] !== 'function'){
document.writeln(name + ':' +another_stooge[name]);
}
}
属性名出现的顺序是不确定的,可以创建一个数组,在其中以正确的顺序包含属性名:
var i;
var properties = [
'first=name',
'middle-name',
'last-name',
'profession'
];
for (i = 0; i < properties.length; i += 1){
document.writeln(properties[i] + ':' +
another_stooge[properties[i]]);
}
-删除
delete运算符可以用来删除对象的属性,不会触及原型链中的任何对象
删除对象的属性可能会让来自原型链中的属性浮现出来
-减少全局变量污染
全局变量会削弱程序的灵活性,应该避免
最小化使用全局变量的一个方法是在应用中只创建唯一一个全局变量