1: 把數字轉換成中文
完成將 toChineseNum, 可以將數字轉換成中文大寫的表示,處理到萬級別,例如 toChineseNum(12345),返回 一萬二千三百四十五。
JavaScript
~~~
const toChineseNum = (num) => {
// TODO
}
~~~
答案:
~~~
const toChineseNum = (num) => {
const number = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] // 定義中文數字
const unit = ['', '十', '百', '千', '萬'] // 定義中文基
const resultStr = []
let len = 0 // 數字長
let lastNumNotZero = false
while(num){
let n = num % 10
let u = len >= unit.length ? len % 5 + 1 : len % 5
// 添加基
if(
n // 當前位存在
|| // 或者
( u == unit.length - 1 && // u 和 長度均為 最后一位unit
len == unit.length - 1
)
)
resultStr.unshift(unit[u])
// 處理數
if(
n || lastNumNotZero // 當前位和前一位不都為零則處理
&&
u !== unit.length - 1 // 且當前位不為最后一位基
)
resultStr.unshift(number[n])
lastNumNotZero = !!n
len++
num = Math.floor(num / 10)
}
return resultStr.join('')
}
~~~
二: safeGet
有時候我們需要訪問一個對象較深的層次,但是如果這個對象某個屬性不存在的話就會報錯,例如:
var data = { a: { b: { c: 'ScriptOJ' } } }
data.a.b.c // => scriptoj
data.a.b.c.d // => 報錯,代碼停止執行
console.log('ScriptOJ') // => 不會被執行
請你完成一個 safeGet 函數,可以安全的獲取無限多層次的數據,一旦數據不存在不會報錯,會返回 undefined,例如:
var data = { a: { b: { c: 'ScriptOJ' } } }
safeGet(data, 'a.b.c') // => scriptoj
safeGet(data, 'a.b.c.d') // => 返回 undefined
safeGet(data, 'a.b.c.d.e.f.g') // => 返回 undefined
console.log('ScriptOJ') // => 打印 ScriptOJ
JavaScript
~~~
const safeGet = (data, path) => {
/* TODO */
}
~~~
答案:
~~~
const safeGet = (o, path) => {
try {
return path.split('.').reduce((o, k) => o[k], o)
} catch (e) {
return void 666
}
}
~~~
三: 簡單的模版引擎
模版引擎是在前端是非常常用的一種工具。請你完成一個簡單的模版引擎的 render 函數,它可以接受模版字符串和一個數據對象作為參數。函數執行返回渲染以后的模版字符串,例如:
const templateStr = `
<ul class="users">
<% users.forEach((user) => { %>
<li class="user-item">
<%= 'My name is ' + user.name %>
</li>
<% }) %>
</ul>
`
const data = {
users: [
{ name: 'Jerry', age: 12 },
{ name: 'Lucy', age: 13 },
{ name: 'Tomy', age: 14 }
]
}
render(templateStr, data)
/*返回結果:
<ul class="users">
<li class="user-item">
My name is Jerry
</li>
<li class="user-item">
My name is Lucy
</li>
<li class="user-item">
My name is Tomy
</li>
</ul>
*/
<% 和 %> 之間可以放置任意的 JavaScript 代碼,而 <%= 和 %> 之間執行任意的 JavaScript 表達式并且輸出在模版上;傳入的 data 可以作為模版引擎執行的上下文進行數據的引用,請你完成 render 函數。
(提示:你可以結合 執行任意表達式 來實現)
答案:
~~~
function render(template, data){
const evalExpr = /<%=(.+?)%>/g
const expr = /<%([\s\S]+?)%>/g
template = template
.replace(evalExpr, '`); \n __echo( $1 ); \n __echo(`')
.replace(expr, '`); \n $1 \n __echo(`')
template = '__echo(`' + template + '`);'
const script =`
let output = ""
const __echo = (html) => output += html
${template}
return output
`
return new Function(...Object.keys(data), script)(...Object.values(data))
}
~~~
四: Don't Touch Me
Tomy 非常敏感,不喜歡別人碰他的東西。一旦有人碰他就會大喊 Don't Touch Me.。
完成 tomy 這個對象,禁止對 tomy 的內容進行修改(增加、修改、刪除)。一旦有人對 tomy 進行任何的修改,都用 console.log 打印 Don't Touch Me.。
答案:
~~~
const tomy = new Proxy({}, {
set () { console.log(`Don't Touch Me.`) },
deleteProperty () { console.log(`Don't Touch Me.`) }
})
~~~
五: 實現 js 數據類型的判斷
最新的 Javascript 標準規定了六種基本數據類型(number, null, undefined, string, boolean, symbol) 和基于 Object 衍生的其它原生數據類型,寫出 type 函數,它傳入一個參數,返回它的數據類型(用小寫字母),比如: type(new Date),返回 date。
答案:
`const type = (obj) => (({}).toString.call(obj).match(/\[object\ (\w+)\]/)[1]).toLowerCase()`
- 前端入門
- 前端入職須知
- 正確看待前端
- 前端自我定位
- pc與手機頁面差別
- 前端書單
- 前端技術棧
- 前端資源導航
- 前端切圖
- 插件
- 組件、控件和插件的區別
- 技術文檔
- layui
- layer彈框在實際項目中的一些應用
- 前端面試題
- bat面試題庫
- 中小公司的leader
- 項目相關
- 職業規劃如何
- 前端經典筆試題
- javascript基礎(一)
- JavaScript基礎二
- JavaScript基礎面試題(三)
- JavaScript基礎面試題(四)
- JavaScript基礎面試題(五)
- JavaScript基礎面試題(六)
- JavaScript基礎面試題(七)
- JavaScript基礎面試題(八)
- JavaScript基礎面試題(九)
- JavaScript基礎面試題(十)
- dom經典面試題
- 正則表達式
- 史上最難面試題
- 簡單算法
- 前端idea
- vsc快速上手指南
- 微信開發者工具
- sublime的使用
- hbuilder入門
- 前端那些事
- 前端的注釋該怎么寫
- 前端架構師是怎么煉成的
- 細數前端的那些技術大牛
- 前端leader的那些事
- ps
- 圖片類型及其區別
- 基本概念及其常用工具
- ps操作技巧
- ps站點資源導航
- ui站點導航
- html
- css
- js
- 插件庫
- git教程
- web
- web兼容思想
- ui框架
- 小程序
- 微信專題
- 支付寶專題