前端题目(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方法
参考:隐式类型转化(https://www.cnblogs.com/kkkllo/p/13502701.html
 
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

 

如若有误,请务必指正

posted @ 2020-09-15 15:28  kkkllo  阅读(317)  评论(0)    收藏  举报