趣味1:原生js实现字符串转为数组,反转数组
/*写个js函数func(str),传参str为一个字符串,实现把这个字符串语句中的单词(空格隔开的)次序逆序。
比如把 I am a coder变成 coder a am I,不允许使用reverse,join,substr,split*/
var str = "I am a coder";
console.log(getStr(str));
/*字符串语句中的单词(空格隔开的)次序逆序*/
function getStr(str) {
var res = "",
temp = "";
for (var i = str.length - 1; i >= 0; i--) {
if (str[i] == " " || i == 0) {
temp += (i == 0 ? str[i] : "");
res += (i == 0 ? reverseStr(temp) : reverseStr(temp) + " "); //处理末尾没有空格
temp = "";
continue;
}
temp += str[i];
}
return res;
}
/*反转字符串*/
function reverseStr(str) {
var newStr = "";
for (var i = str.length - 1; i >= 0; i--) {
newStr += str[i];
}
return newStr;
}
趣味2:对象添加属性,属性是对象,该咋办?
var c={};
var a={a:"a"};
var b={b:"b"};
c[a]=123;
c[b]=345;
console.log(c[a]);
c是对象,添加属性时,都会转为字符串。
这里添加a属性,a是对象,调用toString()方法,转化为字符串“[object,Object]”,所以c就把“[object,Object]”当做属性加进去了,值为123。c[b]同样的道理,但345会覆盖123,所以结果为345
趣味3.如果 对于function的参数arguments 想当做数组来使用数组的内置函数 要怎么做?
Array.prototype.***.call
function test(name,age){
console.log(Array.prototype.join.call(arguments,",")); //xiaowei,18
var arr = ["1","2"];
console.log(arr.concat("3").join(",")); //1,2,3
console.log(Array.prototype.concat.call(arguments,"come").join(",")); //[object Arguments],come
console.log([].slice.call(arguments).concat("come").join(',')); //xiaowei,18,come
console.log(Array.prototype.concat.apply(["come"],arguments)); //come,xiaowei,18
}
test("xiaowei",18);
var name = "lala";
备注:arguments转为数组的方法:[].slice.call(arguments);
或者 Array.prototype.slice.call(arguments);
function fn(a, b, c) {
/*方法一:var arr = [].slice.call(arguments);*/
/*方法二:var arr = [].concat.apply([],arguments);*/
/*方法三*/
var arr = [];
arr.push.apply(arr,arguments);
console.log(arr instanceof Array);
console.log(arr);
}
fn(1,2,3);
趣味4: js 里面数组下标可以是负值问题
var arr = [];
arr[0] = 0;
arr[1] = 1;
arr[-1] = -1;
arr[1.1] = 1.1;
arr['a'] = 'a';
console.log("length: " + arr.length);
console.log(arr);
for(var i in arr){
console.log(i + " :" + arr[i]);
}
数组对象其实是一个特殊对象,他拥有普通对象的全部特性,所以不止负索引,小数索引,连字符串索引都是可以的,只是用这些索引向数组添加属性时,数组的length不会增加罢了,而只有当索引是正整数或其对应数字串时,length才会增加,仅此而已。
例题:
var arr = [];
arr['a'] = 1;
console.log(arr.length); // A
arr['2'] = 2;
console.log(arr.length); // B
arr.length = 0;
console.log(arr); // C
结果为: 0 3 [a:1]
趣味5: js 里面数组设置length为10000,会不会开辟内存?
数组是特殊的对象,可以理解为属性值是数值的对象,当我们直接将一个空数组的length设为10000,并不会多开辟内存空间。
var a=[2,3,4];
a.length=10000;
console.log(a.length); //10000
console.log(a[900]); //undefined,并没有开辟更多的内存空间,js中是用到才开辟
6、函数表达式–匿名函数
var f = function g() {
return 23;
};
typeof g(); //输出什么
// ReferenceError: g is not defined
7、Array.prototype.indexOf() ,switch…case 使用全等模式比较
function showCase(value) {
switch (value) {
case 'A':
console.log(1);
break;
case 'string':
console.log(2);
break;
case undefined:
console.log(3);
break;
case 'undefined':
console.log(4);
break;
default:
console.log(5);
break;
}
}
showCase(new String('A'));
//结果:5