1殖妇、CSS
(1)#root
是 .box
的父元素狱从,兩者寬高都不固定抱怔。用CSS實(shí)現(xiàn).box
相對(duì)于#root
水平和垂直居中劣坊,至少兩種方式。
// 方式一:flex 彈性布局
#root{
display: flex;
justify-content: center;
align-items: center;
}
// 方式二:絕對(duì)定位 + transform
#root{
position: relative;
}
.box{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
(2)position 有哪幾種取值屈留?分別相對(duì)于誰進(jìn)行定位?
可能的值 | 描述 |
---|---|
absolute | 生成絕對(duì)定位的元素测蘑,相對(duì)于 static 定位以外的第一個(gè)父元素進(jìn)行定位灌危。元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進(jìn)行規(guī)定。 |
fixed | 生成固定定位的元素碳胳,相對(duì)于瀏覽器窗口進(jìn)行定位勇蝙。元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進(jìn)行規(guī)定。 |
relative | 生成相對(duì)定位的元素挨约,相對(duì)于其正常位置進(jìn)行定位味混。因此,"left:20" 會(huì)向元素的 LEFT 位置添加 20 像素诫惭。 |
static | 默認(rèn)值翁锡。沒有定位,元素出現(xiàn)在正常的流中(忽略 top, bottom, left, right 或者 z-index 聲明)夕土。 |
inherit | 規(guī)定應(yīng)該從父元素繼承 position 屬性的值馆衔。 |
2、Javascript Basic Knowledge
(3)let 和 var 的區(qū)別怨绣? (let
)
let | var | |
---|---|---|
作用域 | 只在let命令所在的代碼塊內(nèi)有效 | 在全局范圍內(nèi)都有效 |
變量提升 | 不存在 | |
所聲明的變量一定要在聲明后使用角溃,否則報(bào)錯(cuò)。 | 存在 | |
所聲明的變量在聲明之前使用篮撑,會(huì)輸出 undefined | ||
暫時(shí)性死區(qū) | 存在 | |
在代碼塊內(nèi)减细,使用let命令聲明變量之前,該變量都是不可用的赢笨。 | 不存在 | |
重復(fù)聲明 | 不允許 | 允許 |
(4)寫出下面代碼的輸出未蝌?(如果回答正確,用兩種方式對(duì)代碼進(jìn)行改造质欲,使其輸出為6) (let
閉包
)
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();
// correct log
// 10 (用var 聲明的變量 i 是一個(gè)全局變量)
// 使其輸出為6的改造
// 改造方式一:直接將 var 改為 let
// 改造方式二:使用閉包
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = (function (i) {
return function () {
console.log(i);
}
})(i)
}
a[6]();
(5)寫出下面代碼的輸出树埠? (RegExp
)
var regex = /foo/g;
regex.test('foo');
regex.test('foo');
regex.test('barfoo')
regex.test('foobar')
// correct log
var regex = /foo/g;
// regex.lastIndex is at 0
regex.test('foo'); // true
// regex.lastIndex is now at 3
regex.test('foo'); // false
// regex.lastIndex is at 0
regex.test('barfoo') // true
// regex.lastIndex is at 6
regex.test('foobar') // false
(6)寫出下面代碼的輸出?( 箭頭函數(shù)
this指向
)
function Timer() {
this.s1 = 0;
this.s2 = 0;
setInterval(() => this.s1++, 1000);
setInterval(function () {
this.s2++;
}, 1000);
}
var timer = new Timer();
setTimeout(() => console.log('s1: ', timer.s1), 3100);
setTimeout(() => console.log('s2: ', timer.s2), 3100);
// correct log
// s1: 3
// s2: 0
(7)最簡單的方式實(shí)現(xiàn)數(shù)組的深拷貝 (深淺拷貝
)
let deepCopyArr = JSON.parse(JSON.stringify(originalArr))
(8)有下面的類定義和實(shí)例創(chuàng)建: (原型
prototype
)
class Animal extends Object {
}
class Person extends Animal {
}
let jane = new Person()
(8.1)jane.__proto__
和下面哪些選項(xiàng)恒等(===)嘶伟?
A. Person
B. Person.prototype
C. Person.constructor
D. Person.proto
E. Object.getPrototypeOf(jane)
(8.2)jane.prototype
和下面哪些選項(xiàng)恒等(===)怎憋?
A. Person
B. Person.prototype
C. Person.proto
D. undefined
(8.3)jane.constructor
和下面哪些選項(xiàng)恒等(===)?
A. Person
B. Person.prototype
C. Person.prototype.constructor
D. Object.getPrototypeOf(jane)
(8.4)Person.__proto__
和下面哪些選項(xiàng)恒等(===)?
A. jane.proto.constructor
B. Object.getPrototypeOf(jane.constructor)
C. Animal.prototype
D. Object.getPrototypeOf(jane.proto).constructor
(9)用一種最簡單的方式實(shí)現(xiàn)數(shù)組的去重 (Set
)
// 去除數(shù)組的重復(fù)成員
[...new Set(array)]
(10)寫出下面代碼的輸出:(Promise
)
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
}, 1000)
})
const p2 = p1.then(() => {
throw new Error('error~')
})
console.log('p1:', p1)
console.log('p2:', p2)
setTimeout(() => {
console.log('p1:', p1)
console.log('p2:', p2)
}, 2000)
(11)Javascript模塊化標(biāo)準(zhǔn)有哪些绊袋?分別介紹一下它們之間的區(qū)別毕匀。(模塊化
)
(12)import
和 require
的區(qū)別?(模塊化
)
require | import | |
---|---|---|
所屬的模塊化標(biāo)準(zhǔn) | CommonJS | ES6語言層面實(shí)現(xiàn)的模塊功能 |
什么時(shí)候執(zhí)行 | 運(yùn)行時(shí)執(zhí)行模塊加載 | 編譯時(shí)執(zhí)行模塊導(dǎo)入(或者叫靜態(tài)加載) |
加載效率 | 低 | |
實(shí)質(zhì)是整體加載整個(gè)模塊:生成一個(gè)對(duì)象癌别,然后再從這個(gè)對(duì)象上面讀取方法皂岔。這種加載稱為“運(yùn)行時(shí)加載”,因?yàn)橹挥羞\(yùn)行時(shí)才能得到這個(gè)對(duì)象展姐,導(dǎo)致完全沒辦法在編譯時(shí)做“靜態(tài)優(yōu)化”躁垛。 | 高 | |
ES6 模塊不是對(duì)象,而是通過export命令顯式指定輸出的代碼圾笨,再通過import命令輸入教馆。import { stat, exists, readFile } from 'fs'; 上面代碼的實(shí)質(zhì)是從fs模塊加載 3 個(gè)方法,其他方法不加載擂达。這種加載稱為“編譯時(shí)加載”或者靜態(tài)加載土铺,即 ES6 可以在編譯時(shí)就完成模塊加載,效率要比 CommonJS 模塊的加載方式高板鬓。當(dāng)然悲敷,這也導(dǎo)致了沒法引用 ES6 模塊本身,因?yàn)樗皇菍?duì)象俭令。 |
(13)Javascript實(shí)現(xiàn)異步編程的幾種方式 (JS對(duì)異步編程的實(shí)現(xiàn)方式
)
- 回調(diào)函數(shù)
- 事件監(jiān)聽
- 發(fā)布/訂閱
- Promise 對(duì)象
- Generator函數(shù)
(14)async函數(shù)的實(shí)現(xiàn)原理 (Async/Await原理
)
3后德、UI Framework
(15)談?wù)剬?duì)Vue的生命周期的理解?
(16)什么階段才能訪問DOM唤蔗?
(17)Vue-router 路由模式有幾種探遵?
三種: 'hash' 、'history' 妓柜、'abstract'
-
hash
:使用URL hash
值來作路由箱季。支持所有瀏覽器,包括不支持HTML5 History Api
的瀏覽器棍掐。 -
history
:依賴HTML5 History
API 和服務(wù)器配置藏雏。 -
abstract
:支持所有JavaScript 運(yùn)行環(huán)境,如Node.js
服務(wù)器端作煌。如果發(fā)現(xiàn)沒有瀏覽器的 API掘殴,路由會(huì)自動(dòng)強(qiáng)制進(jìn)入這個(gè)模式。
(18)談?wù)剬?duì)React的生命周期的理解粟誓?
(19)如何實(shí)現(xiàn):在父組件Father的生命周期中直接引用子組件Child中某一個(gè)元素(例如一個(gè)input元素)奏寨?寫出實(shí)現(xiàn)的代碼。
(20)談?wù)剬?duì)React中Context的理解鹰服,什么情況下需要使用Context 病瞳?
(21)Redux設(shè)計(jì)的三條重要原則是什么揽咕?為什么reducer必須返回一個(gè)新的state,而不能修改傳入的state對(duì)象套菜?
(22)react redux中表象組件和容器組件的區(qū)別是什么亲善?
Presentational Components | Container Components | |
---|---|---|
Purpose | How things look (markup, styles) | How things work (data fetching, state updates) |
Aware of Redux | No | Yes |
To read data | Read data from props | Subscribe to Redux state |
To change data | Invoke callbacks from props | Dispatch Redux actions |
Are written | By hand | Usually generated by React Redux |