面试中遇到的原生js题总结

 

1、js 去重
1) indexOf

Array.prototype.unique = function(){
var result = [];
var len = this.length;
for(var i = 0; i<len; i++){
if(result.indexOf(this[i])<0){
result.push(this[i]);
}
}
return result;
}
var arr = [1,2,3,2,1,3,2,1];
arr.unique();//arr = [1,2,3]
  • 在IE6、7、8不支持indexOf方法,可以在Array原型链上扩展indexOf方法
if(!Array.prototype.indexOf){
Array.prototype.indexOf = function(val){
var value = this;
for(var i =0; i < value.length; i++){
if(value[i] == val) return i;
}
return -1;
};
}

2)数组先排序

Array.prototype.unique = function(){
this.sort();
var result = [this[0]];
var len = this.length;
for(var i = 0; i<len; i++){
if(this[i] !== result[result.length-1]){
result.push(this[i]);
}
}
return result;
}
var arr = [1,2,3,2,1,3,2,1];
arr.unique();//arr = [1,2,3]

3)ES6新方法set和Array.from

function unique(arr){
return Array.from(new Set(arr));
}
  • set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目,返回的是json对象
  • Array.from可以把类数组对象、可迭代对象转化为数组

2、js 字符串转为驼峰法

function tansform(str){
var re = /-(\w)/g;
return str.replace(re,function($0,$1){//replace 中正则表达式$0,$1,$n等代表正则表达式内小括号的匹配值,从$1开始,$0代表正则表达式的整体值
return $1.toUpperCase();
});
}
var str = 'border-left-color';
tansform(str);//borderLeftColor

3、查找字符串中最多的字符及个数

function repeatCharNum(str){
var arr = str.split('');
str = arr.sort().join('');
var re = /(\w)\1+/g;
var index = 0;
var value = '';
str.replace(re,function($0,$1){
if(index < $0.length){
index = $0.length;
value = $1 ;
}
});
alert ('最多字符'+value+'出现的次数'+index);
}

4、编写一个函数,将输入的参数中的数字字符追加为一个数字字符串,参数输入不确定

function getStrChange(){
var len = arguments.length;//参数不确定时使用arguments关键字
var re = /^\d+$/;
var str = '';debugger;
for(var i =0; i< len; i++){
if(!(re.test(arguments[i]))){
continue;
}
if(i == len-1){
str = str+arguments[i];
}else{
str = str+arguments[i]+',';
}
}
return str;
}
alert(getStrChange('1','a','45','b','3',1));//('1,45,3,1')

5、var和function的预解析问题,以及变量和function的先后顺序的问题

 // 以下代码执行输出结果是什么
function b () {
console.log(a);// function a(){}
var a = 10;
function a() {};
a = 100;
console.log(a);//100
}
b(); function c () {
console.log(a);//function a(){}
function a() {};
var a = 10;
a = 100;
console.log(a);//100
}
c(); (function d (num) {
console.log(num);//100
var num = 10;
}(100)) (function e (num) {
console.log(num);//function num () {};
var num = 10;
function num () {};
}(100)) (function f (num) {
function num () {};
console.log(num);//function num () {};
var num =10
console.log(num);//10
}(100)) //仍然是预解析(在与解析过程中还要考虑一下当前变量的作用于)
function m () {
console.log(a1); // underfined
console.log(a2); // underfined
console.log(b1); // underfined
console.log(b2); // underfined
if(false) {
function b1 (){};
var a1 = 10;
}
if(true) {
function b2 (){};
var a2 = 10;
}
console.log(a1); // underfined
console.log(a2); // 10
console.log(b1); // underfined
console.log(b2); // function
}
m(); function n() {
if(2>1) {
arr = 10;
brr = 10;
let arr;//要在严格模式'use strict'下运行
var brr;
console.log(arr);
console.log(brr);
}
}
n(); // ReferenceError
  • 函数声明:function a(){}可以提前解析;
  • 函数表达式:var b = function a(){} : 命名函数表达式
    var b = function (){} :匿名函数表达式
    (function a(){}) : 表达式
    位运算符:(为了区分函数表达式和函数声明)
    ~funtion a(){} : 表达式
    -funtion a(){} : 表达式
    +funtion a(){} : 表达式
    !funtion a(){} : 表达式
    (不可以被提前解析)
  • 函数表达式和函数声明的区别:函数声明可以提前被解析,函数表达式不可以,需要在引用前提前声明;函数表达式可以直接后面加括号执行,函数声明不可以。
  • let关键字要在严格模式'use strict'下运行

6、判断数据类型

   function gettype(nm){
return Object.prototype.toString.call(nm);
}
console.log(gettype(3)); //[object number]
  • js基础数据类型:number string null undefined string boolean,存放在栈内存
  • js引用数据类型:Object (Array,Date,RegExp,Function),存放在堆内存

7、如何将arguments转为array

function changeArg(arguments){
return Array.prototype.slice.apply(arguments);
}

8、如何判断array对象
可以使用Array.isArray()或者Object.prototype.toString.call()判断

9、原生dom实现删除dom结点

function deleteNode(node){
if(!node) return;
if(node.parentNode){
node.parentNode.removeChild(node);
}
}

10、给button绑定click事件

var x = document.getElementById("myBtn");
if (x.addEventListener) { //所有主流浏览器,除了 IE 8 及更早 IE版本
x.addEventListener("click", myFunction);
} else if (x.attachEvent) { // IE 8 及更早 IE 版本
x.attachEvent("onclick", myFunction);
}
  • 还可以用onclick()绑定,但是onclick()混合了js和html,不建议使用。
  • addEventListener("click", function,useCapture),useCapture默认false,代表事件冒泡阶段执行,true代表事件捕获阶段执行。
  • addEventListener和onclick的区别:addEventListener可以添加多个事件,不会被覆盖;onclick只可以一个事件,重复添加,后面一个会覆盖前面一个的事件。

11、排序算法
1)冒泡排序

相邻元素两两对比然后元素交换

function bubbleSort(arr){

  for(var i = 0;i< arr.length-1;i++){
for(j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}

2)快速排序

获取数组中间的索引 获取数组中间项

function quickSort(arr){
if(arr.length<=1){
return arr;
}
var len = Math.floor(arr.length/2);
var cur = arr.splice(len,1);
var left = [];
var right = [];
for(var i=0;i<arr.length;i++){
if(cur>arr[i]){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quickSort(left).concat(cur,quickSort(right));
}

3)选择排序(Selection sort)

是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
for(var i=0;i<arr.length;i++){//按顺序假设每一个值都是最小值。
var minindex=i;//假设的最小值的索引下标
var minvalue=arr[minindex];//假设的最小值
for(var j=i+1;j<arr.length;j++){
if(minvalue>arr[j]){//数组项的值比假设的最小值还要小,当前这项就是最小值
minvalue=arr[j];
minindex=j;
}
}
//如果获取到了最小值,和假设的最小值进行交换。
if(minindex!=i){//防止假设的真的是最小值,无需自己和自己进行交换。
var temp=arr[i];
arr[i]=arr[minindex];
arr[minindex]=temp;
}

}


原生JS面试题的更多相关文章

  1. 原生JS实现jquery的链式编程。

    这是我根据之前遇到的一个面试题,题目:用原生JS实现$("#ct").on("click",fn).attr("id"). 然后看了篇jqu ...

  2. 【面试篇】寒冬求职季之你必须要懂的原生JS(中)

    互联网寒冬之际,各大公司都缩减了HC,甚至是采取了“裁员”措施,在这样的大环境之下,想要获得一份更好的工作,必然需要付出更多的努力. 一年前,也许你搞清楚闭包,this,原型链,就能获得认可.但是现在 ...

  3. vue.js面试题整理

    Vue.js面试题整理 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务 ...

  4. 一道JS面试题所引发的"血案",透过现象寻本质,再从本质看现象

    觉得本人写的不算很烂的话,可以登录关注一下我的GitHub博客,新手写东西写的不好之处,还望见谅,毕竟水平有限,写东西只为交流提高,一起学习,还望大神多加指点,指出纰漏,和提出宝贵的意见,博客会坚持写 ...

  5. 面试奇遇 -- 原生JS

    最近几日去参加一些面试,多多少少有一些收获. 现将遇到的一些面试题,做一下分析和总结. 1.使用原生JS,不能使用递归,查找dom中所有以“<com-”开头的自定义标签tagName. < ...

  6. [ 转载 ] vue.js面试题一

    转载自:https://www.cnblogs.com/aimeeblogs/p/9501490.html 如有侵权 联系删除 Vue.js面试题整理 一.什么是MVVM? MVVM是Model-Vi ...

  7. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  8. 常用原生JS方法总结(兼容性写法)

    经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...

  9. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

随机推荐

  1. python中的MySQL使用 + pickle使用

    (1)python中有一个包“sqlite3”,可以用来进行数据库相关的操作: 参考下面一个例子: import sqlite3 import pickle img_list = [('a' , 0) ...

  2. 题解-GXOI/GZOI2019 特技飞行

    Problem loj3085 bzoj不放题面差评 题意概要:给出两条竖直直线,再给出 \(n\) 架飞机的初始航线:一条接通这两条直线的线段,保证航线交点不在两条直线上.现要求安排所有飞机在航线相 ...

  3. ffmpeg错误:Invalid UE golomb code

    解决方案在github https://github.com/FFmpeg/FFmpeg/commit/c51c08e0e70c186971385bdbb225f69edd4e3375 问题简要描述为 ...

  4. Linux下查看CPU型号,内存大小,硬盘空间,进程等的命令(详解)

    转自:http://www.jb51.net/article/97157.htm 1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physic ...

  5. windows 2012 如何设置取消禁拼ping

    直接上操作方法: 开始——搜索——高级安全windows防火墙——入站规则找到“文件和打印机共享(回显请求-ICMPv4-in)”右击……选择“启用规则”就OK了! 如果用到IPV6.后面也有 “文件 ...

  6. FJUT-这还是一道数论题

    这还是一道数论题 TimeLimit:4000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Special Judge   Problem D ...

  7. python脚本--mysql数据库升级、备份

    在公司经常要做测试环境的升级.备份.维护:升级后台的应用,不可避免要进行数据库的升级与备份,花了一个上午琢磨了一个脚本分享给大家. ToB的业务,在做环境维护的时候,有初始化环境和增量升级的环境,在测 ...

  8. iOS开发之获取时间戳方法

    // 得到当前本地时间,13位,整形 + (long long)gs_getCurrentTimeToMilliSecond { double currentTime = [[NSDate date] ...

  9. trie字典树:初学

    应用: 1.前缀问题 2.异或问题(转化为前缀问题) 3.查询问题 思想: 将要进行匹配的字符串化为一颗树 字符为边,在结束位置统计该串的全部信息 操作:插入,查询,删除.etc ac: #inclu ...

  10. php curl Problem with the SSL CA cert (path? access rights?)

    公司有台老服务器,搭的php的环境,有个负载均横的服务 调用 curl_init 的时候报了 Problem with the SSL CA cert (path? access rights?) 网 ...