問答
基礎(chǔ)類型有哪些?復(fù)雜類型有哪些?有什么特征?
- 基本類型(undefined,boolean,number,string,null):按值訪問,可以操作保存在變量中的實際的值;
- 基本類型的值是不會通過臨時構(gòu)建的對象方法改變的
var name = 'jozo';
name.toUpperCase(); // 輸出 'JOZO'
console.log(name); // 輸出 'jozo'
- 基本類型的比較是值的比較
- 基本類型的變量是存放在棧區(qū)
- 引用類型(對象、數(shù)組、函數(shù)、正則):其實就是對象,對象是屬性和方法的集合,也就是說引用類型可以擁有屬性和方法,屬性又可以包含基本類型和引用類型。
- 引用類型的值是可以通過方法改變的
- 引用類型的值是同時保存在棧內(nèi)存和堆內(nèi)存中的對象
- 引用類型的比較是引用的比較
引用自 [ JS 進階 ] 基本類型 引用類型 簡單賦值 對象引用](https://segmentfault.com/a/1190000002789651)
如下代碼的輸出? 為什么?
---
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);//false
console.log(obj1 = obj2);//Object {a: 1, b: 2}
console.log(obj1 == obj2);//true
- object是引用類型,在棧區(qū)存放的實際上是指向堆內(nèi)存的指針,也可以說是該對象在堆內(nèi)存的地址。所以obj1 obj2定義了兩個對象,他們在棧區(qū)存放的指針,指向兩個不同的內(nèi)存地址。
- object的比較,實際上比較的是指針,所以console.log(obj1 == obj2);的結(jié)果是false
- obj1 = obj2會將obj2的指針,賦值給obj1;console.log(obj1 = obj2)實際打印出來的就是obj2
- 現(xiàn)在obj1與obj2的指針相同,同時指向了同一內(nèi)存地址,所以他們的比較結(jié)果為true
代碼
---
寫一個函數(shù)getIntv,獲取從當前時間到指定日期的間隔時間
---
var str = getIntv("2018-07-16");
console.log(str); // //"UTC時間:距離2018-07-16還有730天19小時54分56秒"
function getIntv(str){
var time = Date.parse(str) - Date.now();
if(time>=0)
{
var ms = time%1000;
time = Math.floor(time/1000);
var sec = time%60;
time = Math.floor(time/60);
var min = time%60;
time = Math.floor(time/60);
var hour = time%24;
time = Math.floor(time/24);
var days = time;
return "UTC時間:距離"+str+"還有"+days+'天'+hour+'小時'+min+'分'+sec+'秒';
}
else return '東隅已逝,桑榆非晚?'
}
把數(shù)字日期改成中文日期
---
var str = getChsDate('2015-11-31');
console.log(str); // "二零一五年十二月三十一日"
function getChsDate(str){
var time = new Date(str);
var year = time.getFullYear();
var month = time.getMonth()+1;
var day = time.getDate();
function numToCh(val, isYear){
var chNumArr = ['零','一','二','三','四','五','六','七','八','九','十','十一','十二','十三','十四','十五','十六','十七','十八','十九','二十','二十一','二十二','二十三','二十四','二十五','二十六','二十七','二十八','二十九','三十','三十一'];
if(!isYear){
return chNumArr[val];
}
else {
var arr = val.toString().split('');
var chArr = [];
for(var i = 0; i<arr.length; i ++){
chArr.push(chNumArr[Number(arr[i])]);
}
return chArr.join('');
}
}
return numToCh(year, true)+'年'+numToCh(month, false)+'月'+numToCh(day, false)+'日';
}
- [另附一個阿拉伯數(shù)字轉(zhuǎn)中文數(shù)字的實現(xiàn)](http://js.jirengu.com/tilisoroxi/2/edit)
var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];
var chnUnitSection = ["","萬","億","萬億","億億"];
var chnUnitChar = ["","十","百","千"];
function SectionToChinese(section){
var strIns = '', chnStr = '';
var unitPos = 0;
var zero = true;
while(section > 0){
var v = section % 10;
if(v === 0){
if(!zero){
zero = true;
chnStr = chnNumChar[v] + chnStr;
}
}else{
zero = false;
strIns = chnNumChar[v];
strIns += chnUnitChar[unitPos];
chnStr = strIns + chnStr;
}
unitPos++;
section = Math.floor(section / 10);
}
return chnStr;
}
function NumberToChinese(num){
var unitPos = 0;
var strIns = '', chnStr = '';
var needZero = false;
if(num === 0){
return chnNumChar[0];
}
while(num > 0){
var section = num % 10000;
if(needZero){
chnStr = chnNumChar[0] + chnStr;
}
strIns = SectionToChinese(section);
strIns += (section !== 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
chnStr = strIns + chnStr;
needZero = (section < 1000) && (section > 0);
num = Math.floor(num / 10000);
unitPos++;
}
return chnStr;
}
寫一個函數(shù)獲取n天前的日期
---
var lastWeek = getLastNDays(7); // "2016/7/8"
var lastMonth = getLastNDays(30); //"2016/6/15"
function getLastNDays(val){
return (new Date(Date.now()-(val2460601000)).toLocaleDateString());
}
完善如下代碼,用于獲取執(zhí)行時間如:
---
var Runtime = (function(){
var startT,endT;
return {
start: function(){
startT = Date.now();
},
end: function(){
endT = Date.now();
},
get: function(){
return endT - startT;
}
};
}());
Runtime.start();
for(var i = 0;i<10000;i++);
Runtime.end();
console.log( Runtime.get() );
樓梯有200級,每次走1級或是2級,從底走到頂一共有多少種走法?用代碼(遞歸)實現(xiàn)
---
function solution1( n ){
if(n === 0 || n === 1) return 1;
else return solution1(n-1) + solution1(n-2);
}
寫一個json對象深拷貝的方法,json對象可以多層嵌套,值可以是字符串、數(shù)字、布爾、json對象中的任意項
---
var json2 = {"name": "Byron", "age":{ "name":"24"}};
function copyJSON(json){
var newJSON = {};
for(var key in json){
if(typeof json[key] === "object"){
newJSON[key] = copyJSON(json[key]);
}
else newJSON[key] = json[key];
}
return newJSON;
}
var json = copyJSON(json2);
json2 = {"name": "Byron", "age":{ "name": "100"}};
console.log(json);//{"name": "Byron", "age":{ "name":"24"}}
寫一個數(shù)組深拷貝的方法,數(shù)組里的值可以是字符串、數(shù)字、布爾、數(shù)組中的任意項目
---
var arr = [1,2,"1541",["15",5],5];
function copyArr(arr){
var newArr = [];
for(var key=0; key<arr.length; key++){
if(typeof arr[key] === "object"){
newArr[key] = copyArr(arr[key]);
}
else newArr[key] = arr[key];
}
return newArr;
}
var arr2 = copyArr(arr);
arr = [1,2,"1541",["15",6],6];
console.log(arr2); //[1,2,"1541",["15",5],5]
寫一個深拷貝的方法,拷貝對象以及內(nèi)部嵌套的值可以是字符串、數(shù)字、布爾、數(shù)組、json對象中的任意項
---
function deepCopy(oldObj) {
var newObj = oldObj;
if (oldObj && typeof oldObj === 'object') {
newObj = oldObj instanceof Array? [] : {};
for (var i in oldObj) {
newObj[i] = deepCopy(oldObj[i]);
}
}
return newObj;
}
var json1 = 0;
var json2 = [
{"name": "Byron", "age": "24"},
{"name": "Byron2", "age": "25"},
2
];
var js1 = deepCopy(json1);
var js2 = deepCopy(json2);
console.log(js1);//0
console.log(js2);// [{"name": "Byron", "age": "24"}, {"name": "Byron2", "age": "25"},2]
---
本教程歸 張宇 及 饑人谷 所有,轉(zhuǎn)載請注明來源