写这个的原因是,无意间发觉之前学习的东西不够深入,写的代码很冗余,就觉得应该温故知新,多看看,所以这里想把平常忽略的一些知识集中起来归档一下
eg:
var aa = ‘xxx’;
原来写if(aa!=null && aa !=undefined){}后面才知道直接写if(aa){}就可以了,所以感觉还是要多看书多梳理。。。。。。。。。。。但是这里提醒一个,如果是做一个数字的验证我觉得直接写应该是有问题的,0
一、深入理解if的使用方法
Truthy 不等于ture,他是指是在Boolean上下文中转换后的值为真的值。可以理解是,在javascript中所有表达式为 true 的值。同理Falsy指的是在javascript中所有***表达式为false***的值。
eg:if(Truthy ){}
if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码
if…else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码
if…else if…else 语句 - 使用该语句来选择多个代码块之一来执行
switch 语句 - 使用该语句来选择多个代码块之一来执行
二、js中的假值
二、Falsy
JavaScript 中 falsy 值的例子如下 (将 falsy 值转换为`false):
三、new Date()兼容性问题
ie11 有‘-’的时候是不能识别的,所以在ie的时候应该使用‘/’
谷歌
火狐版本62.0 (64 位) 显示的是utc的时间 utc+8个小时时差=北京当地时间
const date = new Date(+new Date() + 8 * 3600 * 1000);
UTC+时区差=本地时间
四、js || && 等运算符操作
首先贴一个优先级
结合上面的js假值进行判断
a || b
1、只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。
2、只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值
a &&b
1、只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;
2、只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;
五、关于array 数组的js各种方法和操作
pop shift unshift push
array.map
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
array.some
定义和用法
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。
array.every
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。
array.foreach
遍历数组
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
注意: forEach() 对于空数组是不会执行回调函数的。
array.filter
检测数值元素,并返回符合条件所有元素的数组。
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
array.toString()
把数组转换为字符串,并返回结果。
JSON.stringify(array)
直接将整个数组转化为字符串
JavaScript 数组有什么特殊之处,而是因为在 JavaScript 中,以数字开头的属性不能用点号引用,必须用方括号。比如,如果一个对象有一个名为 3d 的属性,那么只能用方括号来引用它。下面是具体的例子:
var years = [1950, 1960, 1970, 1980, 1990, 2000, 2010];
console.log(years.0); // 语法错误
console.log(years[0]); // √
六:typeof 返回值问题
typeof (typeof 1) === ‘string’; // typeof总是返回一个字符串
使用 new 操作符节
// All constructor functions while instantiated with ‘new’ keyword will always be typeof ‘object’
var str = new String(‘String’);
var num = new Number(100);
typeof str; // It will return ‘object’
typeof num; // It will return ‘object’
// But there is a exception in case of Function constructor of Javascript
var func = new Function();
typeof func; // It will return ‘function’
IE 特别提示节
在IE 6,7和8上,很多宿主对象是对象而不是函数。例如:
typeof alert === ‘object’
七:js中和es6相关的操作
多行字符串
由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ...
表示:
js原生的时候是用“+”进行变量拼接同时使用引号进行字符串的接收和使用;
es6实现将变量拼接使用${}装变量同时字符串使用 ...
反引号包裹
八、js函数声明和函数表达式的区别
1、函数声明必须带有标识符(函数名称),函数表达式则可以省略
表达式里的名字不能在函数外面用,只能在函数内部用
函数有一个name属性,指向紧跟在function关键字之后的那个函数名。如果函数表达式没有名字,那 name属性指向变量名
2、函数声明会被预解析,函数表达式不会
自执行函数也叫立即调用的函数表达式(IIFE)
函数声明不能直接调用的原因
小括号里只能放表达式,不能放语句
function关键字即可以当作语句,也可以当作表达式。但js规定function关键字出现在行首,一律解释成语句
解决方法:不要让function出现在行首
用括号把function主体括起来,转成表达式。后面加括号运行
借助运算符(new + - ! ~ typeof , && ||…)
因为运算符会把表达式执行,执行后得出结果了才能运算
只要把函数声明转成表达式,再加上括号就可以声明。那就有很多稀奇古怪的方式来执行函数
九、js面向对象思维
概念:ECMA-262 把对象定义为:无序属性的集合,器属性可以包含基本值、对象或者函数。
Object.defineProperty 有兼容性,只适合在ie8及以上使用 当个创建
数据属性
实例:var person = {}
Object.defineProperty(person,‘name’,{
writable:false,
value:‘lucky’
})
Object.defineProperty(对象,属性名称,一个描述符对象(属性是否只读Writable,Value值是什么))
也可以直接使用get,set实现对已有属性的接收和修改 (访问器属性)
Object.defineProperty(person,‘name’,{
get:function(){
retrun this.name
},
set:function(newValue){
this.name =newValue
}
})
Object.definepropertIes 针对多个属性同时定义和修改
Object.definepropertIes(对象,{
多个属性同时赋值等,或者使用get,set重新获取或者设置这个值
})
创建对象值几种模式
1、工厂模式
相当于创建一个总的方法,在里面调用new Object 创建一个实例,添加属性方法等,让后返回这个方法
缺点:不能分辨出是属于那种类型的函数
eg: function createPerson(name,age){
var eg = new Object();
eg.name = name;
eg.age = age;
return eg
}
var person1 = createPerson('lily',20);
2、构造函数模式
使用new 关键字构造一个新函数
缺点:里面的方法中名称是同一个,但每创建一个,内部方法也创建一个,不同实例上的同名函数是不相等的。
function Person(name,age){
this.name = name;
this.age = age;
this.ChangeName = function(){
console.log(this.name)
}
}
var person1 = new Person(‘lucy’,20)
//注意事项 函数名第一个字母大写
作用域更改为当前的作用域
使用instanceof 基础的形式person1继承了Person的左右属性和方法---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3、原型模式
定义一个函数 然后通过protoype 定义对象的方法和属性,直接在原生链中定义。使其方法和对象都保证是使用的一个对象上的东西
缺点: 就是其属性如果是引用类型的时候更改新创建的对象时,原对象的原生链也会跟着更改
4、组合使用构造函数模式和原型模式
属性 使用this 的形式 使用new 创建对象
但是方法使用prototype的形式实现
九、函数声明和变量提升 和同名问题
1、函数声明优先变量声明
2、函数声明提升是刚开始的时候就直接读取到了函数和函数的值,但是变量是先读取声明再第二步赋值的位置才会读取值
console.log(test()) //123
function test(){
console.log('123')
}
console.log(test)
//ƒ test(){
//console.log('123')
//}
var test = 2;
console.log(test) //2
3、当函数声明和变量声明同名的时候 js实行执行顺序由上到下,赋值由内到外的规律。
当声明后函数声明优于变量,所以上面第一个是函数test先什么并且赋值执行 。然后var test;
声明,这里声明不起作用。后面test=2过后相当于在给之前函数的test赋值 直接就变为了2
参考:[https://blog.youkuaiyun.com/FE_dev/article/details/68943341](https://blog.youkuaiyun.com/FE_dev/article/details/68943341)
摘自:《JavaScript高级程序设计》
参考文献:[https://blog.youkuaiyun.com/she_lock/article/details/80929613](https://blog.youkuaiyun.com/she_lock/article/details/80929613)
[https://www.cnblogs.com/renbo/p/8098962.html](https://www.cnblogs.com/renbo/p/8098962.html)
[https://blog.youkuaiyun.com/thlzjfefe/article/details/84403349](https://blog.youkuaiyun.com/thlzjfefe/article/details/84403349)
[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array)
[https://segmentfault.com/a/1190000016496022](https://segmentfault.com/a/1190000016496022)