前端题目(4)
1.
var foo = NaN
function foo() {
}
console.log(typeof foo)
// number
预编译,变量提升的问题
1. 先是变量和形参的提升 var foo = undefined
2 .再是变量和形参相统一
3. 再是函数提升 function foo(){}
然后就是执行 foo = NaN
2.
let x = {
toString() { return 20 },
valueOf() { return '30' }
}
console.log(x == '20') // false
console.log(x == 30) // true
先调用valueof转化成基本类型,如果调用了之后不是基本类型就调用toString方法
3.
let xx = {
foo: 100
}
Object.defineProperty(xx, 'foo', {
get() {
return 200
}
})
console.log(xx.foo)
// 200
.标志符就是调用这个属性的get方法
4.
function fn(a = 1) {
console.log(a)
}
fn() // 1
fn(undefined) // 1
fn(null) // null
fn(false) // false
给函数参数设置默认值,当没有传递参数的时候生效
当声明一个变量如果未赋值,就默认是undefined
5.
把 '1.20'转化成1.2
+'1.20'
Number('1.20')
parseFloat('1.20')
console.log()
6.
null == '0' // false
undefined == '0' // false
[] == false // true
[] == [] // false
// []是引用类型,这个值是存在堆内存中的,是堆内存中两个不一样的 {} == {} // false
7.
let arr = ['a', 'b']
for (let a in arr) {
console.log(a)
}
for (let a of arr) {
console.log(a)
}
// 0, 1
// a,b
// for in 循环的a是key, for of循环的a是value
for in 可以遍历对象属性,但是for of不能遍历简单对象
如果想使用for of来遍历对象,可以结合Object.keys(),因为Object.keys()会返回一个属性名的数组
关于 for of
原理:被遍历对象上部署了Symbol.iterator属性,即具有itertator接口
只要具有iterator接口,就可以使用for of 遍历
数组,set,map和一些类数组对象(例如字符串,DOMnodeList,arguments,但不是所有的类数组对象都可以,但是可以通过Array.from来遍历)都有iterator接口
数组,set,map的entries(), keys(),values()返回的都是遍历器对象,都是可以for of 遍历的
8.
关于forEach遍历
是不会被return 或者break中断的
9.
{ var a = 0 }
{ let b = 0 }
{ let a = 1 }
{ var b = 1}
console.log(a, b)
// 0 1
// let的原理是不能在同一个作用域中重复声明,所以即使1,4行的变量声明提升到全局作用域,但是let的作用域是作用在他的块级上的。
10.
把button设置为disabled
1. button.setAttribute('disable', true) // 有效
2. button.disable = true // 有效
3. button.enable = false // html的button目前暂时没有发现enable属性
11.
匹配1~64
首先/^(1-64)$/, 这样是错误的,因为正则的匹配是一位一位匹配的
所以 str.match(/^(([1-5]\d)|[1-9]|6[0-4])$/)
12.
给宽高相等的idv设置圆角,border-radius:25%,50%,100%,200%;分别的效果是什么?
首先,先讲讲border-radius的原理:border-radius和border的设置类似,可以设置一个值,两个值,三个值,四个值。表示给四个角设置。每个角又可以设置两个值,水平方向的半径和垂直方向的半径。
设置值又分为数字值和百分数。
个人以为画圆角的过程就是画椭圆的过程,要符合设计值,还要让四个角能平滑的连接起来。
如果只设置一个值,最大有效值的范围就在需要满足的最小值中。因为四个角都要满足要求(一般是50%,超过有效范围之后,就没有效了,就表现为最大有效值的表现形式)
如果是两个值,三个值,或者四个值,就要灵活的多。
所以这里100%和200%的表现形式和50%的表现形式相同。
13.
Symbol.for('a') === Symbol.for('a')
// true
虽然Symbol('n')和Symbol.for('n')都是生成一个Symbol的变量
原理不同Symbol.for('n')会先去找有没有以该参数作为名称的Symbol,如果有就返回这个值,如果没有就重新创建一个Symol。
但是Symbol('n')是不会去查找是否存在,直接重新创建一个
所以Symbol('n') === Symbol('n') // false
14.
1 let obj = { 2 foo: 100, 3 log () { 4 foo = 200 5 console.log(this.foo) 6 } 7 } 8 obj.log() // 100 9 let { log } = obj 10 log() // 200
第4行代码对foo的设置,设置的是全局上的foo,设置的并不是obj上的foo。如果想要设置obj上的foo,就要写obj.foo,或者this.foo(当this指向obj的时候)
15.
导致浏览器报HTTPS证书警告
1. 私有CA颁发的证书
2. 站点的端口与证书颁发的端口不同
3. 站点的域名和证书颁发的域名不同
4. 自签名证书
5. 过期证书
16. csp可以禁止外部代码加载
可以预防xss攻击
可以控制图片等资源的加载
17.
一般浏览器默认的字体大小是16px。但是我们一般会通过css修改默认字体大小为10px。
为什么是10px呢?因为1rem = 10px,设置样式是方便计算,不会有小数
18.
http响应头中的content-length是http实体主体部分的长度,是编译之后,压缩之后的长度。
19.
同域即同源
20.
查看服务器开放的某个端口的 netstat
如若有误,请务必指正
如若有错,请务必指正

浙公网安备 33010602011771号