对象 (objects)
-
简单数据类型
-
数字(number):
let num = 1,f =1.0;
console.log(typeof num,typeof f); 向控制台输出 不区分整型和浮点型(js是不适合用来做高精确运算的语言) 例如:
console.log(0.1+0.2); 其值可能会等于0.300000000004(精度有问题) let lastName = name[0](获取字符串第一个字符的长度) name.substring(1,name.length); //相当于[1,name.length) -
字符串(String):
例如:
let name = '我是谁';
console.log(typeof name, name.length); //面向对象的写法 name.lenght(获取字符串长度)
在JavaScript中可以使用console.log(1 + name) //可以使用数字 + 字符串
-
布尔值(boolean):
ture or false
-
未定义(undefined):
console.log(typeof gf); //返回值为undefined gf 未定义
-
空值(null):
let gf = null; //声明了,但没有值
但是在用 typeof 输出类型时,其可能不会显示 null ,因为JS typeof 是有点错位的(JS 是一周设计出来的)
-
-
复杂数据类型(引用数据类型)
-
对象(object):
object JS 一切皆是对象
{ } 、 [ ] 、 () => { } object array function reg
const obj = { //const 表示常量
name:'我是谁', isString:true}
console.log(obj); // 常量对象的属性可以修改
-
-
typeof 运算符,可以得到变量类型
-
JS数据类型分为简单数据类型和复杂数据类型,使用 typeof 关键字可以得到变量的数据类型。
The Bad parts(有问题的):
1. null ,浮点数, array 在意料之外。 2. let a = 1; a = "name"; //可以覆盖 -
JS是一门脚本语言(不需要编译可以直接运行)、全栈语言(在命令行运行)、动态弱类型语言
对象字面量
(如果属性名是合法的,则并不强制要求用引号括住属性名,反之则需要例如: "first-name") 属性名可以是包括空字符串在内的任何字符串。
var empty_object = { };
除了基本数据类型,只有对象 数组是对象、函数是对象,正则表达式也是对象,对象自然也是对象
检索
-
要检索对象里包含的值,可以才用在 [ ] 后缀中括住一个字符串表达式的方法 (属性名不合法的情况下) 合法的情况下可以使用 . 表示法代替
例如:
stooge["first-name"] //"Jerome" flight.departure.IATA //"SYD" 表示为取出对象flight中嵌套的departure对象中的IATA属性 (这就说明对象是可以嵌套的)在检索过程中如果尝试检索对象中不存在的成员属性的值,则会返回undefined(未定义)
尝试从undefined的成员属性中取值将会导致TypeError异常 可以通过 && 运算符来避免错误
flight.equipment //undefind flight.equipment.model //throw "TypeError" flight.equipment && flight.equipment.model //undefind
更新
- 赋值语句更新对象
-
如果赋值的属性名已经存在在对象中 则当赋值时 原属性值会被替换掉
-
如果对象没有拥有这个属性名时,则该属性会被添加到对象中
-
引用
-
对象通过引用来传递,他们永远都不会被复制
例如:
var x = stooge; x.nickname = 'Curly'; var nick = stooge.nickname; //nick为'Curly' var a = { }, b = { }, c = { }; //a ,b ,c 每个都引用了一个不同的空对象 a = b = c = { }; //引用了相同的空对象
原型
-
每个对象都连接到一个原型对象,并且它可以从中继承属性。
-
原型连接在更新时是不起作用的。当我们对某个对象做出改变时,不会触及该对象的原型。
-
如果我们添加一个新的属性到原型中,该属性会立即对所有基于该属性创建的对象可见(意思就是成为原型属性的分子)
反射
-
constructor //每个对象都含有,其始终指向创建当前对象实例(构造)函数
-
toString() //返回以字符串表示的Number对象值。如果方法有两个参数,返回用第二个参数指定基数表示的第一个参数的字符串表示形式 例如:
var num = 15; var n = num.toString(); //n输出为15 其为字符串 var b = num.toString(2); //将15转化为二进制 1111 -
原型链中的任何属性都会产生值。
例如:
typeof flight.toString // 'function' typeof flight.constructor //'function'有两种方法去处理这些不需要的属性
1. 让程序做检查并丢弃值为函数的属性 2. 使用hasOWNproperty方法,如果对象拥有独有的属性,它将返回true。 //该方法不会检查原型链
枚举
-
for in 语句用来遍历一个对象中的所有属性名。
例如:
var name; for (name in another_stooge){ if (typeof abother_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.lenght; i++ ){ document.writeln(properties[i]+ ':' + another_stooge[properties[i]]); }
通过for 可以得到我们想要的属性
删除
- delete运算符可以用来删除对象的属性
- 删除对象的属性可能会让来自原型链中的属性透视出来(对象的属性可能来自原型链)
减少全局变量污染
两种方法
-
为应用只创建一个唯一的全局变量:(把全局性资源都纳入一个名称空间下,你的程序与其他应用程序、组件或类库之间发生冲突的可能性就会显著降低)
var MYAPP ={ } MYAPP.stooge = { "first-name":"Joe", "last-name":"Howard" }; MYAPP.flight = { airline:"Oceanic", number: 815, departure:{ IATA: "SYD", time: "2004-09-22 14:55", city: "Sydney" }, arrival:{ IATA: "LAX", time: "2004-09-23 14:55", city: "Los Angeless" } }; -
用闭包来进行信息隐藏 (函数 和 函数内部能访问到的变量(也叫环境)的总和,就是一个闭包) //局部变量