JS的全局变量问题
在刷题的时候我们尽量用let const的语法,遇到新的变量时也千万别忘了加。
不然很可能定义成全局变量了,然后因为作用域的原因值就不对,特别是遇到什么递归啊回溯啊啥的…
var age = 28;
let ages = 18;
//console.log(window.age);//28
//console.log(window.ages);//undefined
ES5中声明的全局变量是顶级对象的属性,但ES6中不再是。
数据、对象的一个遍历问题
关于for…in 、for…of
const obj = {
'abc': ['kk', 'bb'], 'def': ['mm'], 'ghi': ['jj', 'kk'] }
for (let i in obj) {
console.log(i);//abc def ghi
console.log(obj[i]);//['kk', 'bb'] ['mm'] ['jj', 'kk']
}
const arr = ['a', 'b', 'c', 'd', 'e']
for (let i in arr) {
console.log(i);//in返回的是索引0,1,...,4
}
for (let i of arr) {
console.log(i);//of返回的是'a', 'b', 'c', 'd', 'e'
}
splice slice 数组
这些方法是针对数组的,
splice方法改变原数组
arr.splice(i,num) 意味着从第i个开始删除num个元素
arr.splice(i,0,‘a’)意味着在第i个元素处插入’a’,要在第i个元素后插入要写成arr.splice(i+1,0,‘a’)
slice会返回新的数组(注意关于浅拷贝深拷贝的问题)
slice一般用于截取,arr.slice(start,end) 从start开始不包括end截取,只有一个参数时,默认截取到最后一个元素
substr substring 字符串
语法:substr(start [,length]) 第一个字符的索引是0,start必选 length可选
substring(start [, end]) 第一个字符的索引是0,start必选 end可选
相同点:当有一个参数时,两者的功能是一样的,返回从start指定的位置直到字符串结束的子串
var str = “hello Tony”;
str.substr(6); //Tony
str.substring(6); //Tony
不同点:有两个参数时
(1)substr(start,length) 返回从start位置开始length长度的子串
“goodboy”.substr(1,6); //oodboy
【注】当length为0或者负数,返回空字符串
(2)substring(start,end) 返回从start位置开始到end位置的子串(不包含end)
“goodboy”.substring(1,6); //oodbo
js的if判断object
var arr = new Array();
// 或 var arr = [];
我们知道,初始化后,即使数组arr中没有元素,也是一个object。
typeof arr;
// “object”
既然是object,用于判断条件时就会被转化为true
if(arr)console.log(“it’s true”);
// it’s true
//也就是说我们做题时对数组(或者对象)判空不要直接用if(xx)因为他是空的也会执行,判断数组为空的方法:
1.length来判断;
判断对象为空的方法:
1.Object.keys(obj).length==0
2.if (JSON.stringify(data) === ‘{}’) {
return false // 如果为空,返回false
}
return true // 如果不为空,则会执行到这一步,返回true
3.for in遍历 能便利的话就不是空的
if(for keys in obj){
return true}
return false
4.var data = {};
var arr = Object.getOwnPropertyNames(data);
console.log( arr.length == 0 ); //true
获取的属性名会放在一个数组中,根据它的长度判断
js的typeof和instanceof的区别
一,typeof:
typeof运算符的返回类型为字符串,值包括如下几种:
1. 'undefined' --未定义的变量或值
2. 'boolean' --布尔类型的变量或值
3. 'string' --字符串类型的变量或值
4. 'number' --数字类型的变量或值
5. 'object' --对象类型的变量或值,或者null(这个是js历史遗留问题,将null作为object类型处理),或者是正则表达式,数组
6. 'function' --函数类型的变量或值
几个示例值得注意:
console.log((typeof function () { }));//'function'
console.log((typeof class { }));//'function'
console.log((typeof new String()));//'object'
console.log((typeof NaN));//'number'
console.log(typeof []);//object
console.log(typeof null);//object
console.log(typeof /\w+/);//object
typeof null返回的是object要注意,至于原因:
js遗留问题,js的值都用32位机器码(二进制)表示的,标志位在低位用1-3个二进制编码表示,object的表示是000,而null是空指针值也为0,所以也用000表示的。
000 => object类型
001 => number类型(整数)
010 => number类型(浮点型)
100 => string类型
110 => boolean类型
undefined => 整数-2^30(整数之外)
null => 0到31位皆为0(正好满足第0-3位皆为0的情况)
二.instanceof :
返回的是true/false
instanceof的官方解释是判断构造函数的prototype是否在对象的原型链上:
function Car(make, model, year)