JavaScript 整理笔记(三)

1.1 语法

1.1.6 表达式

  • 表达式后面一般跟着:
    • 一个运算符 与 另一个表达式
    • 三元运算符
    • 函数调用
    • 属性提取表达式
运算符优先级 从上往下优先级由高到低
	. [] ()                        -   提取属性与调用函数
	delete new typeof + - !        -   一元运算符
	* / %                          -   乘法 除法 求余
	+ -                            -   加法/连接 减法
	>= <= > <                      -   大于等于 小于等于 大于 小于
	=== !==                        -   全等于 不去等于
	&&                             -   逻辑与
	||                             -   逻辑或
	?:                             -   三元运算符
typeof 运算符产生的值只有 ‘number’、‘string’、‘boolean’、‘undefined’、'function’和’object’这六个值。
其中 typeof null === 'object', typeof [] === 'object',这是不对的。
通常用函数来判断:
function DataType(obj, type) {
	return Object.prototype.toString.call(obj) === "[object " + type + "]" ? true : false;
}
+ 运算符 可以进行加法运算或字符串连接。加法时确保两个运算数都是数字。否则会进行隐式转换。
'0' + 1 === '01'; // true
1 + '0' === '10'; // true
1 + 0 === 1; // true
&& 运算符 逻辑与 真&&真为真,真&&假为假,假&&真为假,假&&假为假。
var a = 0;
a && a++; // false
a; // 0

var b = 1;
b && b++; // true
b; // 2
第一个运算数(或表达式)如果为false,则不执行第二个运算数(或表达式)。
第一个运算数(或表达式)如果为true,则执行第二个运算数(或表达式)。

|| 运算符 逻辑或 真||真为真,真||假为真,假||真为真,假||假为假。
var c = 0;
c || c++; // true
c; // 1

var d = 1;
d || d++; // true
d; // 1
第一个运算数(或表达式)如果为false,则执行第二个运算数(或表达式)。
第一个运算数(或表达式)如果为true,则不执行第二个运算数(或表达式)。

! 运算符 逻辑非 !真为假,!假为真。
!true === false; // true
!false === true; // true
!undefined === true; // true
!null === true; // true
!"" === true; // true
!0 === ture; // true
!NaN === true; // true

1.2 对象

1.2.1 对象字面量

- 创建新对象值的表示法。
var obj = {};
var obj_2 = {
	name: "Ama_zhe",
	"": "hello world"
};
obj_2[""] === "hello world"; // true
- 属性名可以是包括空字符串的任何字符串。属性名如果是合法的JavaScript标识符并且不是保留字,则属性名不需要引号。
var obj_3 = {
	value: 1,
	"first-name": "fan"
}

1.2.3 检索

  • 检索对象里的值
  • 优先使用.语法,其次是[]语法。如果检索的属性名是一个表达式来表示则使用[]来获取。
  • 检索不存在的属性会返回undefined。
  • 可以使用||运算符来默认填充:
var hello = obj_3.status || "0"; // "0"
- 如果从undefined中获取属性会报错,用&&来提前判断
var hi = obj_3.status && obj_3.status.value; // undefined

1.2.4 更新

- 对象的属性名如果已经存在,再对对象的属性名赋值时会更新其属性的值。
obj_3.value = 2;
obj_3.value === 2; // true
- 如果对象之前没有该属性名,则会给对象添加该属性。
obj_3.name = "Stafan";
obj_3; // { value: 2, "first-name": "fan", name: "Stafan" }

1.2.5 引用

- 对象是通过引用来传递值。它们永远不会被复制。
var a = obj_3;
a.status = "1";
var b = obj_3.status;
b; // "1" a和obj_3指向同一个对象引用,a.status相当于给obj_3添加了status属性,所有b的值为"1"。
var c = {}, d = {}, e = {}; // 分别引用不同的空对象
c === d; // false
c === e; // false
d === e; // false
var f = g = h = {}; //都引用同一个空对象
f === g; // true
f === h; // true
g === h; // true

1.2.6 原型

- 每个对象都连接到一个原型对象。所有通过字面量创建的对象都连接到 Object.prototype。
if(typeof Object.create != "function"){
	Object.create = function(obj){
		var Fn = function(){};
		Fn.prototype = obj;
		return new Fn();
	}
}
var obj = {
	name: "a",
	value: "100"
};
var obj2 = Object.create(obj);
obj2.name = "b";     // 该对象改变是不会影响到该对象的原型
obj2.value = "200";  // 该对象改变是不会影响到该对象的原型
obj.name; // "a"
obj.value; // "100"
obj2.name; // "b"    该对象改变是不会影响到该对象的原型
obj2.value; // "200" 该对象改变是不会影响到该对象的原型
- 但是在检索对象的属性时,如果该对象没有要检索的属性,则会从原型对象中去获取。如果对象及其原型链中都没有要获取的属性,则返回 undefined。
obj.data = "data";
obj2.data; // "data"
obj2.opt; // undefined

1.2.7 反射

- 检查对象的属性的类型:
var obj3 = {
	name: "Ama_zhe",
	number: 2,
	obj: {}
};
typeof obj3.name === "string"; // true
typeof obj3.number === "number"; // true
typeof obj3.obj === "object"; // true
typeof obj3.aaa === "undefined"; // true
- 检查原型链中的任何属性都会返回 “funtion”:
typeof obj3.toString === "function"; // true
typeof obj3.constructor === "function"; // true
typeof obj3.valueOf === "function"; // true
- hasOwnProperty 会检查对象独有的属性,而不会检查原型链:
obj3.hasOwnProperty(name) === true; // true
obj3.hasOwnProperty(toString) === false; // true

1.2.8 枚举

  • for…in 会枚举对象中的所有的属性名(包括原型链中的属性),用hasOwnProperty 和
  • typeof 来过滤掉不想要的属性或函数。
  • 属性名出现的顺序是不确定的,如果想要属性以特定的顺序出现,最好避免使用for…in。

1.2.9 删除

- delete 运算符用来删除对象的属性。不会删除原型链中的同名属性。
var obj6 = {
	a: 1,
	b: 2
};
delete obj6.a;
obj6; // { b: 2 }
 
var obj = {
	a: 1,
	b: 2,
	name: "seven"
};
var Fn = function(){};
Fn.prototype = obj;
var obj_n = new Fn();
obj_n.name = "eight";
obj_n.name; // "eight"
delete obj_n.name;
obj_n.name; // "seven"

1.2.10 减少全局变量污染

- 最小化全局变量的方法就是只创建唯一的一个全局变量:
var GLOBAL_VARIABLE = {};
- 定义其他的变量为该全局变量的属性:
GLOBAL_VARIABLE.API = {
	common_link: ""
};
GLOBAL_VARIABLE.initFn = {
	add: function(){
		var sum = 0;
		Array.apply(this, arguments).map(function(a){
			sum += a;
		});
		return sum;
	}
};

欢迎访问我的博客 Ama_zhe
--------内容系个人整理,如有错误,欢迎指出。谢谢!--------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值