数组
数组基础
声明数组方法 , 有哪三种方法?
var arr = []; //数组字面量
var arr = new Array(); //new Array构造函数声明数组 //实参不能有空值,有空会报错
var arr = Array(); //这种一般不使用,但能声明出来
//所有数组都继承于Array.prototype, 上面三种构造出来的数组都是Array构造出来的
声明对象的方法
同数组一样 //var obj = {} , new Object() , Object()
数组到底是什么
数组的下标就是对象的键名,数组的值就是对象的键值;
数组是另一种对象的形式,只是写法不同,但访问机制是相同的;
var arr = [1,2,3];
var obj = {0:1, 1:2, 2:3};
index
数组元素的下标, 索引值,从0开始的;
声明稀松数组的2种方法:
字面量声明稀松数组:
//数组中间可以有空值,但最后一位没有值,则代表没有最后一位; 控制指的是留空;
var arr = [,,]; //empty x 2
arr = [,1,3, , , 5, 7]; //empty, 1,3,empty x 2, 5,7
new构造函数声明稀松数组:
//不能有空值,如果有空会报错
// var arr = new Array(5,,6); //相当于把实参列表变为数组,所以中间不能为空;
//构建空值empty数组, new Array(5) 生成
var arr = new Array(5); //empty x 5
打印数组不存在的下标元素是什么?
undefined, 相当于打印对象中不存在的属性;
数组的方法哪里来的呀?- 一面最有可能问;
它们是继承了构造函数Array的原型(ptototype)上面的属性和方法;
数组的方法
以下都是修改原数组的方法:
unshift, push, shift, pop, splice, reverse, sort
添加
unshift() //返回值是执行了方法以后的数组长度 前边添加
push() //返回值是执行了方法以后的数组的长度 //后边添加 //可添加(多个值)
剪切
shift() //返回值是剪切掉的数组第一位,shift没有参数
pop() //返回值是剪切掉的数组最后一位, pop里面是没有参数的
倒序
reverse() //倒序的功能 //返回值是 -
增减(剪切/替换/添加) 重点
splice() //splice(1,1); //从下标为1,剪切1位
//splice(1,2,3); //从1位置删除2位,再把3添加进删除的位置;
//三个参数,(开始项的下标,剪切长度,在删除的位置前添加多个数据-以逗号隔开)
// 第三个参数 - 要看做在xxx之前添加;
sort(); //正负数分开,绝对值升序排序; //-1,-5, 0, 2, 6 //负号的ascii码是45,比数值ascii小,所以排在前面;
//字母升序排序, //a, b, d, x, y, z
//首位ascii排序: //27, 49, 5, 7 //相当于比较 2,4,5,7
//返回值是 - 排序以后的数组;
//sort排序原理: 按照首位Ascii码的整数值来排序, 会出错;
//自定义排序比较函数: // 必须有参数a, b //必须有返回值
// 负值-a小于b,a排前面(升序的时候不动);
// 正值-a大于b,b排前面;
//正值交换
//赋值和0并不狡猾
// (0, 保持不动;可以任意归到正值或负值里面)
//顺序为冒泡排序法, arr = [27, 49, 5, 7]; 27跟49, 跟5, 跟7逐一比较,小的排到前面去;然后49跟后面的比较;最后是5跟7比较;
//sort(function(a,b){return a - b; })
//随机排序怎么排
笔试题:
var arr = ['a','b','c','e'];
实现在e的位置,添加d,用两种方式实现.
arr.splice(3,0,'d');
arr.splice(-1,0,'d');
实现自定义的数组排序:
sort(function(){
return a - b; //返回 a-b,正值,负值或0; //升序排
return b - a; //降序排 //选择其中一个排序
})
sort(function(){
if(a > b){
return 1;
}else{
return -1;
// 如果是小于或等于,return -1, 因为小于或等于相当于不用换位置;
}
});
数组随机排序怎么排?
// Math.random() //返回值是0到1之间,开区间的浮点小数;
var arr = [1,2,3,4,5];
arr.sort(function(a,b){
return Math.random() - 0.5; //随机返回正值或负值
});
自己实现push()方法
自己实现unshift方法:
用splice(0,0,xxx);
自己实现splice - 实现负值传入定位
var arr = ['a','b','c','e'];
function splice(arr, index){
return index += index >= 0 ? 0 : arr.length;
}
var ind = splice(arr, -2);
console.log(ind);
作业 数组
1. 用splice重写数组原型上的unshift方法,命名为unshift;
2. 请按照字节数排序下列字符串
数组2
数组操作2,排序
重点笔试题:
// GO ={
// getName: undefined -> fun(){con(5)} -> fun(){con (4)}
// Foo: function Foo(){}
//}
//笔试题 综合性题
function Foo(){
getName = function(){ //这里声明了一个伪全局变量, 只有Foo执行的时候才生效;
consolelog(1);
}
return this;
}
Foo.getName = function(){ // Foo是一个函数对象, 这里借用Foo在上面挂了getName的属性, 和.length一样; //只有Foo.getName能访问到; 不影响构造函数本身;
console.log(2);
}
Foo.prototype.getName = function(){ //原型上放了getName方法
console.log(3);
}
var getName = function(){ //全局变量, 执行的时候赋值了函数体
console.log(4);
}
function getName(){ //getName函数声明
console.log(5);
}
// Foo.getName(); //2
// getName(); //4
// Foo().getName(); //1
// getName(); //1
// new Foo.getName(); //2 //new 2 //.的优先级比new高, 所以先执行后面的;
// new Foo().getName(); //3 //()优先级最高,而new Foo()是在一起的,所以先声明了一个对象, 然后对象调用this.getName方法; //对象里没有,所以到原型链上去找,找到了prototype上面的getName方法;
// new new Foo().getName(); //3 同上一个执行的, 后面执行了输出2,然后前面加了new, 所以是new 2, new一个字面量没意义;
// 2 4 1 1 2 3 3
// 字符优先级的图片
// 括号优先级最高, 如果有new Fun() 则是连载一起的; Foo()则先执行;
// .的优先级次之;
数组方法2: (新建一个新的数组来访问)
.concat() //合并两数组,返回值是新数组 //var str = arr1.concat(arr2); //原来数组不变;
.toString() //把数组放回成逗号分隔的字符串;
.slice(start,end) //从给定下标截取数组, [前开后闭区间) //若不给则从第一个截取到最后, 拷贝一份数组
// slice(1,2); - 返回从开始下标截取,到结束下标之前的中间部分
// slice(); - 如果不填,则返回一份复制圆数组
// slice(1); - 只填开始下标,截取到最后;
// slice(-3,-1); - 可用负参数; //返回从-3下标开始截取,到-1下标之前的部分
.join(分隔符) //数组转字符串
//就是把数组的元素放入一个字符串,参数就是分隔符, ‘,’ ’ ’ ’ - ‘,取以上分隔符都可以
//返回值是生成的字符串;
.split(分隔符,截取长度) //字符串转数组,可设置转换后数组的长度
//可以吧字符串变成数组,参数就是区分的分隔符; 返回值是生成的数组;
//arr.split(’-’,3); //以-作为分隔符,同时只截取3位;
类数组
- 类数组是类似于数组的对象,它的原型是Object.prototype,不是Array的原型;
- 如果length属性为4, 则必须要有0到3的属性对, 若缺了会显示empty x n的提示;
- 类数组并不是数组;
- 典型的类数组 - arguments;
- 类数组包含两个部分,第一是要有属性:值,第二是要有length属性
类数组的应用:
自定义一个类数组, 然后自定义添加属性和方法,非常灵活;
如给它添加数组的push方法; //‘push’: Array.prototype.push,
把对象大括号变成数组的方括号的方法?
给类数组添加属性, ‘splice’: Array.prototype.splice,
给加上length属性
类数组转换成数组的方法:
Array.prototype.slice.call(arguments); //返回值是目标数组
深度封装typeof的方法:- 能区分array,null,object
function myTypeof(val){
var type = typeof(val);
var res = {
"[object Array]":'array',
'[object Object]':'object',
'[object Number]':'object number',
'[object Boolean]':'object boolean',
'[object String]':'object String'
}
var toStr = Object.prototype.toString;
if(val === null){
return 'null';
}else if(type === 'object'){
var key = toStr.call(val);
return res[key];
}else{
return type;
}
}
myTypeof('2');
数组去重方法
// 数组去重, 最优算法, 答案;
Array.prototype.unique = function (){
//实现方法,判断{}中,有没有这个属性, 来添加
//只有{}中不存在这个属性的时候才添加, 同时push一次;
var temp = {},
newArr = [];
for(var i = 0; i < this.length; i++){
if(!temp.hasOwnProperty(this[i])){
temp[this[i]] = this[i];
newArr.push(this[i]);
}
}
return newArr;
}
var arr = [1,2,3,1];
// console.log(arr.unique());
字符串去重实现:
String.prototype.unique = function(){
var temp = {},
newStr = '';
for(var i = 0; i < this.length; i++){
if(!temp.hasOwnProperty(this[i])){
temp[this[i]] = this[i];
newStr += this[i];
}
}
return newStr;
}
var strr = '112233';
console.log(strr.unique());
百度外卖算法题 - 重要笔试题
//找出一串字符中的, 只出现一次的第一个字符;
//百度外卖笔试题
//考点,利用对象实现算法功能
var str = 'jfklajssklfbsnlfnklcleklnlslklkfnlkenflgg'; //就是找出a
function test(str){
//思路, 用对象的形式, 顺序加入并计数, 遍历对象返回第一个值为1的字母
var temp = {};
for(var i = 0; i < str.length; i++){
if(!temp.hasOwnProperty(str[i])){
temp[str[i]] = 1;
}else{
temp[str[i]]++;
}
}
for(var char in temp){
if(temp[char] == 1){
return char;
}
}
}
// console.log(test(str));
//闭包笔试题
function test(a, b, c){
var d = 0;
this.a = a;
this.b = b;
this.c = c;
function e(){
d++;
console.llog(d);
}
this.f = e;
}
var test1 = new Test();
test1.f();
test1.f();
test2.f();
// 1,2,1