javaScript的变量、值与类型

2017-01-13 10:48:17来源:segmentfault作者:zjhjszwx人点击

本文主要是奇舞前端特训营的笔记
https://t.75team.com/video


变量

变量声明的三种方法


1.var-声明一个变量,可选择将其初始化为一个值


- 不支持块级作用域
- var存在变量提升
console.log(a === undefined) //true
var a = 10;

2.let-声明一个块级作用域变量,可选择将其初始化一个值


- 块级作用域
{
let x = 10;
}
console.log(typeof x); //undefined
- 同一作用域中不允许重复声明
- 暂存死区
- 循环中的let作用域
- 浏览器兼容性

3.const-声明一个只读的常量 绑定的值不可以再次改变


类型

ECMAScript语言中所有的值都有一个对应的语言类型。ECMAScript语言类型包括Undefined、Null、Boolean、String、Number和Object。
对语言引擎和开发人员来说,类型是值的内部特征,它定义了值的行为,以使其区别于其他值


JavaScript有七种内置类型:


空值(null)
未定义(undefined)
布尔值( boolean)
数字(number)
字符串(string)
对象(object)
符号(symbol,ES6中新增)
除对象之外,其他统称为“基本类型”。


Boolean
值:true和false
需要注意:0,"", null, undefined, 会被隐式的转化为false,其他都为true

建议采用严格比较,可以通过!!将非boolean转化为boolean


比较操作符总会返回boolean


布尔操作符&&和||不会转化类型

&&和||具有短路特性


console.log(null !== undefined, null == undefined); //true, true
console.log(1 && 2) //2

Number


数值范围
整数-2^53~2^53


超过后会有精度丢失

小数精度Number.EPSILON
Infinity, Number.MAX_VALUE, Number.MIN_VALUE


浮点数精度问题
console.log(0.2+0.4) //0.6000000000000001
限制精度


console.log((0.2+0.4).toFixed(2)); // 0.60

String

引号规范和转义
建议使用单引号


字符串类型转换
console.log('1'+2, '2'-1);//'12', 1 隐式类型转化
字符串模版

Object

对象是个引用类型


值类型和包装类型
包装类型typeof是object

对象的copy


let conf = {
adapter: 'sqlite',
db: {
aqlite: {
name: 'xxx.sqlite'
},
mysql: {
name: 'xxx',
username: 'work',
passwd: '***'
}
}
}// ES5浅拷贝
let copied = Object.assign({}, conf);
copied.adapter = 'mySql';
console.log(conf.adapter); //sqlite
console.log(copied.adapter); //mySqlcopied.db.mySql.name = 'yyy.sqlite';
console.log(conf.db.mySql.name); //yyy.sqlite// 深拷贝
function deepCopy(des, src){
for( var key in src){
let prop = src[key];
if(typeof prop === 'object'){
des[key] = des[key] || {}; // typeof{} === object
deepCopy(des[key], src[key]);
}else {
des[key] = src[key];
}
}
return des;
}
let deepCopied = deepCopy({}, conf);
deepCopied.db.sqlite.name = 'zzz.sqlite';
// 深拷贝
console.log(deepCopied.db.sqlite.name, conf.db.sqlite.name);//'zzz.sqlite, yyy.sqlite'对象的类型和构造器

new和constructor


new是一种语法糖


prototype


//原型链
// __proto__暴力构建原型链
var a = {x: 1},b = {y: 2}, c = {z: 3};
b.__proto__ = a;
c.__proto__ = b;
console.log(c);// 使用Object.create(a)构建原型链
var a = {x: 1};
var b = Object.create(a);
b.y = 2;
var c = Object.create(b);
c.z = 3;
console.log(c);// 使用构造器构建原型链
function A(){
this.x = 1;
}
function B(){
this.y = 2;
}
B.prototype = new A();
function C(){
this.z = 3;
}
C.prototype = new B();
var c = new C();
console.log(c);// 三种方式都是等价的

一张图片有助于理解


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台