1.取模运算的结果符号只与左边值的符号有关:
var x = 7 % 3; // 结果为 1
var y = 7 % (-3); // 结果为 1
var z = (-7) % 3; // 结果为 -1
2. null、undefined、0、NaN、空字符串转换(Boolean()方法)为false(五类),其他转化为 true
console.log('' == false)//true
console.log(0 == false)//true
console.log(NaN == false)//false
console.log(undefined == false)//false
console.log(null == false)//false
console.log('-----------------------')
console.log('' ? true : false)//false
console.log(0 ? true : false)//false
console.log(NaN ? true : false)//false
console.log(undefined ? true : false)//false
console.log(null ? true : false)//false
console.log(![] == [])// true
console.log([]==[])// false 分别占用了两个内存空间
console.log([] ? true : false)//false Boolean()方法转换为true,一般判断为false
console.log(Boolean(null) == 0)//true
console.log(isNaN('123'))//false 隐式转换
console.log(isNaN(123))//false
console.log('undefined', isNaN(undefined))//true
console.log('null', isNaN(null))//false null-->0
console.log(1 == !null)//true !null-->1
Number,Boolean,String,Undefined这几种基本类型混合比较时,会将其转换成数字再进行比较 基本类型与复合对象进行比较时,会先将复合对象转换成基本类型(依次调用valueOf与toString方法)再进行比较 undefined被当成基本类型,undefined转换成数字是NaN,因此undefined与除null之外的其它类型值进行比较时始终返回false(注意NaN==NaN返回false) null被当成复合对象,由于null没有valueOf与toString方法,因此和除了undefined之外的其它类型值进行比较时始终返回false
https://blog.csdn.net/magic_xiang/article/details/83686224
3.null是一个只有一个值的特殊类型。表示一个空对象引用(一个变量不再指向任何对象地址);可以主动释放一个变量引用的对象。null是对象所以可以来清空对象,任何变量都可以通过设置值为undefined 来清空,类型为 undefined.
// 数组清空,直接给数组的length变为0
let arr = ['apple', 'banana', 'orange']
arr.length = 0
console.log(arr)
4.for in 可以循环数组和对象,推荐对象的时候用for in,数组的时候用for of,for of不可以循环普通对象,自定义属性遍历不出来。for of不会跳过无定义的值,for in 会跳过无定义的值如下:
// 不可以遍历普通对象
var obj = { name: 'liu', age: 27 }
for (let item of obj) {
console.log(item)//Uncaught TypeError: arr is not iterable
}
// 自定义属性遍历不出来
let arr = ['apple', 'banana', 'orange']
arr.name = 'name';//自定义属性
for (let keys of arr) {
console.log(keys)//apple banana orange
}
arr.push('milk')//数组push方法还有用
console.log(arr.length)//4 自定义属性不会改变数组长度
console.log('-----------')
// 自定义添加的属性数组 不具有数组相关的属性和方法
let arr1 = []
arr1.name = 'apple';
arr1.banana = 'banana';
console.log(arr1.length)//0
for (let keys of arr1) {
console.log(keys)//遍历不出来
}
arr1.push('milk')//数组push方法还有用
console.log(arr1)//["milk", name: "apple", banana: "banana"]
// for of不会跳过无定义的值,for in 会跳过无定义的值如下:
var arr = [, 'apple', 'banana', 'orange']
for (var key in arr) {
console.log(arr[key])//apple banana orange
}
// console.log('--------')
for (var item of arr) {
console.log(item)//undefined apple banana orange
}
5.forEach()方法按升序为数组中含有效值的每一项执行一次callback 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)forEach()的返回值为undefined forEach()对于空数组是不会执行回调函数的没有办法中止或者跳出 forEach()循环,除了抛出一个异常
[2, 3, 1, , , 7].forEach((val, index, arr) => {
console.log(val)//2 3 1 7
})
6.Map方法中加入Number参数可以将数组中的字符串数字转化成数字
var arr = ['1', '4', '3']
var newArr = arr.map((value, index, array) => {
return value
})
var newArr1 = arr.map(str => parseInt(str));
var newArr2 = arr.map(Number)
console.log(newArr)// '1', '4', '3'
console.log(newArr1)// 1 4 3
console.log(newArr2)// 1 4 3
7.下面输出的值是多少?(考察this)
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function (fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
输出:10 2 第一次输出10应该没有问题。我们知道取对象属于除了点操作符还可以用中括号,所以第二次执行时相当于arguments调用方法,this指向arguments,而这里传了两个参数,故输出arguments长度为2。
8.以下输出结果是?(变量隐式声明)
if ('a' in window) {
var a = 10;
}
console.log(a);
function和var会提前声明,而其实{...}内的变量也会提前声明。于是代码还没执行前,a变量已经被声明,于是 'a' in window 返回true,a被赋值。
var a = 10;
a.pro = 10;
console.log(a.pro + a);
var s = 'hello';
s.pro = 'world';
console.log(s.pro + s);
9.Number 对象方法
toExponential(x)把对象的值转换为指数计数法
toFixed(x)把数字转换为字符串,结果的小数点后有指定位数的数字。 |
toPrecision(x)把数字格式化为指定的长度。
toString()把数字转换为字符串,使用指定的基数
valueOf()返回一个 Number 对象的基本数字值。
let a = 3;
console.log(a.toExponential())//3e+0
console.log(typeof a.toExponential())//string
console.log(a.toFixed(2))//3.00
console.log(typeof a.toFixed(2))//string
console.log(a.toPrecision(2))//3.00
console.log(typeof a.toPrecision(2))//string
10.许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一个是供jQuery函数使用的版本。由于后者不通过jQuery对象操作,所以相对开销较小,速度比较快
var $text = $("#text");
var $ts = $text.text();
// 改良后↓
var $text = $("#text");
var $ts = $.text($text);
// 这里是用了“$.text() ”的内置函数,其他类似的还有“$.data() ”等
11.字符串的拼接在开发中会经常遇到,用“+=”的方式来拼接字符串的效率非常的低,我们可以利用数组的“.join()”方法。
console.time('测试时间')
var arr = [];
for (var i = 0; i < 100; i++) {
arr[i] = `<li>${i}</li>`;
}
$('ul').html(arr.join(''));
console.timeEnd('测试时间')
// 以前我很喜欢用数组的原生的方法“.push() ”,
// 其实直接用arr[i]或者arr[arr.length]的方式要快一点,但是差别不是很大。
12.不要让代码暴露在全局作用域下
image.png
13.background-position 和 background-size 属性, 之间需使用/分隔, 且position值在前, size值在后。如果同时使用 background-origin 和 background-clip 属性, origin属性值需在clip属性值之前, 如果origin与clip属性值相同, 则可只设置一个值。
background: url("image.png") 10px 20px/100px no-repeat content-box;
14.设置为null的变量或者对象会被内存收集器回收,null转为数字类型值为0,而undefined转为数字类型为 NaN(Not a Number)
Number(null)//0
0 == null//false
null == false//false
15.javascript判断是否是数组方法总结
// 判断是不是数组
// ① 方法简单有效,缺点是IE8及以下版本浏览器不兼容
var arr = [3, 4, 5, 6]
var isArr = Array.isArray(arr)
console.log(isArr)
// ②
var arr = [3, 4, 5, 6]
var isArr = arr instanceof Array
console.log(isArr)
// ③
var arr = [3, 4, 5, 6]
var isArr = arr.constructor === Array
console.log(isArr)
console.log(typeof arr)
// 判断数组封装的方法
function isArray(obj) {
return typeof obj == 'object' && obj.constructor == Array
}
// ④第二第三种方法也有列外情况,比如在跨框架iframe的时候使用页面中的数组时会失败,
// 因为在不同的框架iframe中,创建的数组是不会相互共享其prototype属性的;当第二第
// 三种方法也不能用时,可以使用最通用的方法 Object.prototype.toString.call()
function isArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}//仅判断Array
function isType(data, type) {
return Object.prototype.toString.call(data) === "[object " + type + "]";
} //通用判断方法
// 方法中的call()可以换成apply(),不能直接用toString调用,
// 因为从原型链的角度讲,所有对象的原型链最终都指向了 Object,
// 按照JS变量查找规则,其他对象应该也可以直接访问到 Object 的
// toString方法,但是大部分的对象都实现了自身的 toString 方
// 法,这样就可能会导致 Object 的 toString 被终止查找,因此要用
// call或apply 来强制调用Object 的 toString 方法
拓展:怎么判断一个变量是数组
1、Array.isArray判断,返回true,说明是数组
2、instanceof Array判断,返回true。说明是数组
3、使用Object.prototype.toString.call判断,如果值是[object Array],说明是数组
4、通过constructor来判断,如果是数组,那么arr.constructor === Array(不准确,因为我们可以指定obj.constructor = Array)
function fn() {
console.log(Array.isArray(arguments)); //false; 因为arguments是类数组,但不是数组
console.log(Array.isArray([1, 2, 3, 4])); //true
console.log(arguments instanceof Array); //fasle
console.log([1, 2, 3, 4] instanceof Array); //true
console.log(Object.prototype.toString.call(arguments)); //[object Arguments]
console.log(Object.prototype.toString.call([1, 2, 3, 4])); //[object Array]
console.log(arguments.constructor === Array); //false
arguments.constructor = Array;
console.log(arguments.constructor === Array); //true
console.log(Array.isArray(arguments)); //false
}
fn(1, 2, 3, 4);
16.innerText、innerHTML、outerHTML的区别
<body>
<p><span><i>234567</i></span></p>
</body>
<script>
let a = document.querySelector('p').outerHTML
let b = document.querySelector('p').innerHTML
let c = document.querySelector('p').innerText
console.log(a);//<p><span><i>234567</i></span></p>
console.log(b);//<span><i>234567</i></span>
console.log(c);//234567
</script>
17.
18.
19.
20.
21.
22.
23.
24.
25.










网友评论