计算机前端面试题总结-暑期实习(答案补充2)

news2024/9/22 1:41:03

目录

技术方面

二、js

1.js数据类型

1)值类型(基本类型)

2)引用数据类型(对象类型)

​编辑

2.判断数据类型是否为数组类型

1)Array.isArray()

2)instanceof操作符

3) Object.prototype.toString.call()方法

3.NaN是什么数据类型,全称,有何特点

1)定义

2)例子

3)要点解析

4.js中,0.1+0.2为什么不等于0.3,如何实现等于

1)原因

2)解决方式

(1)使用Number.EPSILON进行比较

(2)放大倍数相加后再缩小还原

(3)外部库(decimal.js等)

5.typeof有什么局限,能识别全部数据吗

6..如何获取所有被选择的checkbox元素

​编辑

7.点击dom节点执行某个函数

8.循环方法

1)for / for...in / for...of循环

2)while / do...while循环

3)Array.prototype.foreach()

9.怎么快速找到数组的某个值

1)只想知道某个值是否存在于数组中 -- includes

2)找到数组中的某个值,并知道该值在数组中的索引位置 -- indexOf(),find(),findIndex()

(1)indexOf()

(2)find()

(3)findIndex()

10.let,var,const区别

1)作用域

补充:变量提升

(1)为什么要变量提升

(2)变量提升具体表现

​编辑

2)重复声明

3)重新赋值

11.null和undefined区别

1)定义

2)类型

12.操作数组有哪些原生方法

13.以下语句输出什么:

14.以下语句输出什么:

console.log()

补充:

真值与true:

15.以下语句输出什么:

16.获取当前时间,形式为“YYYY-MM-DD”

17.合并两个数组并删掉第二个元素

1)使用concat()合并数组,并使用splice()删除第二个元素

2)使用扩展运算符(...)和splice()

18.js写方法消除字符串中的重复内容,比如“aabbbbbcccd”,消除后为“abcd”


技术方面

二、js

1.js数据类型

1)值类型(基本类型)
  • String:字符串
  • Number:数字,包含整数和浮点数
  • Boolean:布尔类型,true of false
  • Null:表示空值或没有对象值
  • Undefined:当变量声明但未赋值时,默认值为undefined
  • Symbol:表示独一无二的值,通常用作对象的属性名

例子:

值类型定义例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js数据类型</title>
    <script>
        let num = 42; // 整数
        let floatNum = 3.14; // 浮点数
        console.log(typeof num,typeof floatNum);// 输出:number number

        let str = "Hello, world!";
        console.log(typeof str);// 输出:string

        let isDone = false;
        let isReady = true;
        console.log(typeof isDone,typeof isReady);// 输出:boolean boolean

        let undefinedVar;
        console.log(undefinedVar); // 输出: undefined

        let emptyObj = null;
        console.log(emptyObj); // 输出: null

        let sym = Symbol("description");
        console.log(sym); // 输出: Symbol(description)

    </script>
</head>
123
</body>
</html>

结果:

2)引用数据类型(对象类型)
  • Object:对象。
  • Array:数组,用于存储有序集合的数据。
  • Function:函数,既可以作为值传递,也可以作为参数传递,还可以作为其他函数的返回值。
  • RegExp:正则,用于定义字符串的搜索模式。
  • Date:日期,用于处理日期和时间。

对象定义及使用例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js数据类型</title>
    <script>
        // 定义一个对象
        let student = {
            name: "Marry",
            gender: "female",
            age: 20,
            country:'China',
            greet: function() {
                return `Hello, my name is ${this.name}, I'm from ${this.country} originally.`;
            }
        };

        // 使用点符号(.)或方括号([])访问属性
        console.log(student.name); // 输出: Marry
        console.log(student["name"]); // 输出: Marry

        // 调用对象的方法
        console.log(student.greet()); // 输出: Hello, my name is Marry, I'm from China originally.

        // 修改对象的属性
        student.age = 21;
        console.log(student.age); // 输出: 21

        // 添加新的属性
        student.email = "marry@example.com";
        console.log(student.email); // 输出: johndoe@example.com

        // 遍历对象的属性
        for (let key in student) {
            console.log(`${key}: ${student[key]}`);
        }

    </script>
</head>
123
</body>
</html>

结果:

2.判断数据类型是否为数组类型

1)Array.isArray()

直接检查对象是否为数组类型,且不会因数组所在的执行上下文不同而受到影响。

2)instanceof操作符

测试一个对象在其原型链中是否存在一个构造函数的prototype属性。对于数组,可以使用Array构造函数来测试。

3) Object.prototype.toString.call()方法
let arr = [1, 2, 3];
console.log(Array.isArray(arr)); // true
console.log(arr instanceof Array); // true
console.log(Object.prototype.toString.call(arr) === '[object Array]'); // true

3.NaN是什么数据类型,全称,有何特点

1)定义

NaN(Not-a-Number)是一个特殊的数值,表示某些数学运算的结果不是数字。NaN的类型是Number,但它与任何值(包括它自身)的比较结果都是false。

2)例子
let result1 = 0 / 0;
let result2 = 's';
let result3=2 / 3;
let result4 = "";

console.log(isNaN(result1),isNaN(result2),isNaN(result3),isNaN(result4)); // 输出: true true false false
console.log(typeof result1,typeof result2,typeof result3); // 输出: number string number
console.log(result1 === NaN,result2 === NaN,result3 === NaN,NaN === NaN); // 输出: false false false false
console.log(Number.isNaN(result1),Number.isNaN(result2),Number.isNaN(result3)); // 输出: true false false

结果:

3)要点解析

(1) isNaN会尝试将其参数转换为数字,然后检查转换后的值是否为NaN,而Number.isNaN则不会进行类型转换,直接检查其参数是否为NaN,是则返回true,不是返回false。

(2)isNaN对字符串's'(或任何其他非数字的字符串)作为数字进行操作时,JavaScript会尝试解析这个字符串以获取一个数字。但是,由于's'不包含任何可以解释为数字的有效字符序列(比如数字字符、小数点等),因此解析失败,JavaScript按照规则将其视为无法表示为一个有效的数字值,并返回NaN。

(3)可以解析为有效数字的情况有:数字字符串(如“123”,“23.35”,“-890”,“1.23e4”),前导空格或零(如“  123”,“00123”),空字符串(“”在转换为数字时会得到0)

(4)NaN的类型是Number,但它与任何值(包括它自身)的比较结果都是false。(因为NaN是一个特殊的值,被设计为表示一个不确定或无效的数字结果,因此它不应该被视为等于任何其他值,包括它自己。这种设计有助于在编程中更容易地检测和处理无效或未定义的数值结果。)

4.js中,0.1+0.2为什么不等于0.3,如何实现等于

1)原因

在js(以及许多其他编程语言)中,浮点数通常使用IEEE 754标准来表示。这个标准定义了一种在计算机中存储浮点数的方法,它支持非常大和非常小的数,但有一个关键的限制:它不能精确表示所有的十进制小数。这是因为IEEE 754浮点数是以二进制形式存储的,而某些十进制小数在二进制下是无限循环的。

十进制小数0.1和0.2,它们在二进制下分别是无限循环小数:

  • 0.1(十进制)在二进制中表示为0.00011001100110011...
  • 0.2(十进制)在二进制中表示为0.0011001100110011...

转换过程(0.1转为二进制):

  1. 开始:0.1(十进制)
  2. 乘以2:0.1*2=0.2,整数部分为0
  3. 取小数部分继续:0.2的小数部分再乘以2,0.2*2=0.4,整数部分为0
  4. 继续:0.4的小数部分乘以2,0.4*2=0.8,整数部分为0
  5. 继续:0.8的小数部分乘以2,0.8*2=1.6,整数部分为1,小数部分为0.6
  6. 继续(这里开始循环):0.6的小数部分乘以2,0.6*2=1.2,整数部分为1,小数部分为0.2(与步骤2相同,循环)

因此,0.1的二进制近似表示为0.00011001100...(其中1100会无限重复),0.2转换过程同理。

在js中执行0.1+0.2时,实际上是在对这两个数的二进制表示的有限近似值进行加法运算。

2)解决方式
(1)使用Number.EPSILON进行比较

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON

利用epsilon值作比较,计算0.1+0.2和0.3的差值的绝对值(Math.abs()),如果这个绝对值小于epsilon,则认为它们是相等的。

function numbersCloseEnoughToEqual(num1, num2) {
   return Math.abs(num1 - num2) < Number.EPSILON;
}

console.log(numbersCloseEnoughToEqual(0.1 + 0.2, 0.3));
// 对于更一般的情况,可自行设定,使用更宽松的epsilon值
const epsilon = 1e-6;
console.log(Math.abs(0.1 + 0.2 - 0.3) < epsilon);
(2)放大倍数相加后再缩小还原

将0.1+0.2的值和0.3的值同时放大10的precision次方(Math.pow())后舍入为最接近的整数(Math.round()),比较两值是否相等。

function compareFloats(num1, num2, precision = 3) {  
    return Math.round(num1 * Math.pow(10, precision)) === Math.round(num2 * Math.pow(10, precision));  
}  
  
console.log(compareFloats(0.1 + 0.2, 0.3, 1)); 
(3)外部库(decimal.js等)

有些JavaScript库(如decimal.js、bignumber.js等)提供了高精度的十进制运算支持。这些库可以帮助进行精确的浮点数运算,避免舍入误差。

let a = new Decimal(0.1);
let b = new Decimal(0.2);
let sum = a.plus(b);

console.log(sum.toString() === '0.3'); // true

5.typeof有什么局限,能识别全部数据吗

typeof运算符在js中用于确定一个值的数据类型,它可以区分基本数据类型,但是对于所有对象类型的数据(如数组、对象)都会返回object,且null也会返回object

例子:

let student = {
            name: "Marry",
            gender: "female",
            age: 20,
            country:'China',
            greet: function() {
                return `Hello, my name is ${this.name}, I'm from ${this.country} originally.`;
            }
        };

        let arr = [1, 2, 3];
        let func1 = function (){}

        console.log(typeof student); // object
        console.log(typeof arr); // object
        console.log(typeof null); // object
        
        console.log(typeof func1); // function
        console.log(typeof undefined); // undefined
        console.log(typeof NaN); // number

结果:

6..如何获取所有被选择的checkbox元素

例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js</title>
    <script>
        function getCheckedBoxes() {
            // 获取页面上所有的checkbox元素
            let checkboxes=document.querySelectorAll('input[type=checkbox]');
            // 创建一个数组来存储所有被选中的checkbox的值
            let selectedValues = [];
            // 遍历每一个checkbox
            checkboxes.forEach(function(checkbox) {
                // 如果checkbox被选中,则将其值添加到selectedValues数组中
                if (checkbox.checked) {
                    selectedValues.push(checkbox.value);
                }
            });

            return selectedValues;
        }

    </script>
</head>
<div class="container">
    <input type="checkbox" id="checkbox1" name="checkbox1" value="value1">选择1
    <input type="checkbox" id="checkbox2" name="checkbox2" value="value2">选择2
    <input type="checkbox" id="checkbox3" name="checkbox3" value="value3">选择3
</div>
</body>
</html>

结果:

如果要在页面实时显示(js监听):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js</title>
    <script>
        function updateSelectedValues() {
            // 获取页面上所有的checkbox元素
            let checkboxes=document.querySelectorAll('input[type=checkbox]');
            // 创建一个数组来存储所有被选中的checkbox的值
            let selectedValues = [];
            // 遍历每一个checkbox
            checkboxes.forEach(function(checkbox) {
                // 如果checkbox被选中,则将其值添加到selectedValues数组中
                if (checkbox.checked) {
                    selectedValues.push(checkbox.value);
                }
            });

            // 更新页面上显示已选中checkbox值的元素
            document.getElementById('selectedValues').textContent = '当前选择了: ' + selectedValues.join(', ');
        }

        // 页面初始化显示
        window.onload = function (){
            updateSelectedValues();

            // change事件监听器
            document.querySelectorAll('input[type=checkbox]').forEach(function (checkbox){
                checkbox.addEventListener('change',updateSelectedValues);
            })
        }

    </script>
</head>
<div class="container">
    <input type="checkbox" id="checkbox1" name="checkbox1" value="value1">选择1
    <input type="checkbox" id="checkbox2" name="checkbox2" value="value2">选择2
    <input type="checkbox" id="checkbox3" name="checkbox3" value="value3">选择3
    <p>当前选择了<span id="selectedValues"></span></p>
</div>
</body>
</html>

结果:

7.点击dom节点执行某个函数

在原生js中,可以用click事件监听器的方式绑定点击事件与执行函数:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>js</title>
</head>
<div class="container">
    <button id="button" name="button">点击按钮</button>
</div>

<script>
    let button = document.getElementById("button");
    button.addEventListener('click',showAlert);

    function showAlert(){
        alert('按钮被点击');
    }
    
</script>
</body>
</html>

结果:

其他比如在vue中,可以用@click等绑定点击事件

8.循环方法

1)for / for...in / for...of循环
// for循环
        for (let i = 0; i < 5; i++) {
            console.log(i);
        }

        // for...in循环,用于遍历对象的所有可枚举属性
        const obj = {a: 1, b: 2, c: 3};
        for (let key in obj) {
            console.log(key, obj[key]);
        }

        // for...of循环,直接遍历对象的值,而不是索引或键
        const arr = [1, 2, 3];
        for (let value of arr) {
            console.log(value);
        }
2)while / do...while循环
// while循环
        let j = 0;
        while (j < 5) {
            console.log(j);
            j++;
        }

        // do...while循环
        let k = 0;
        do {
            console.log(k);
            k++;
        } while (k < 5);
3)Array.prototype.foreach()

它不是一个循环语句,是一个数组方法,允许对数组的每个元素执行一次提供的函数。它不是一个真正的循环,因为它没有迭代控制(如break或continue),但它经常用于遍历数组。

// Array.prototype.foreach()循环
        const array = [1, 2, 3];
        array.forEach(function(value) {
            console.log(value);
        });

9.怎么快速找到数组的某个值

1)只想知道某个值是否存在于数组中 -- includes
let arr = [1,2,3,4,5];
        console.log(arr.includes(3)); // true
        console.log(arr.includes(7)) // false
2)找到数组中的某个值,并知道该值在数组中的索引位置 -- indexOf(),find(),findIndex()
(1)indexOf()

输入参数为要找的某个值,返回值为该值在数组中的下标(索引),如果数组中不存在该值则返回-1,如果值有重复则会返回第一个找到的元素的下标。

let array = [1,2,3,4,5,5];

        let index1 = array.indexOf(4); // 查找值4的索引
        console.log(index1); // 输出: 3

        let index2 = array.indexOf(9); // 查找不存在的值9
        console.log(index2); // 输出: -1

        let index3 = array.indexOf(5); // 查找重复值5
        console.log(index3); // 输出: 4
(2)find()

find方法返回数组中满足条件的第一个元素的值。否则返回undefined。find返回的是元素本身。

let array = [5, 12, 8, 130, 44];
        let value1 = array.find(element => element > 10); // 查找第一个大于10的元素
        console.log(value1); // 输出: 12

        let value3 = array.find(element => element === 3); // 查找不存在的值3
        console.log(value3); // 输出: undefined
(3)findIndex()

与find类似,但findIndex返回的是元素的索引。如果数组中没有任何元素满足查找条件,则返回-1。

let array = [5, 12, 8, 130, 44];
        let index1 = array.findIndex(element => element > 10); // 查找第一个大于10的元素的索引
        console.log(index1); // 输出: 1 , 找到的元素是12,对应下标是1

        let index2 = array.findIndex(element => element === 3); // 查找不存在的值3的索引
        console.log(index2); // 输出: -1

10.let,var,const区别

1)作用域
  • varvar声明的变量具有函数作用域或全局作用域,但不具有块级作用域。这意味着var变量可以在声明它的函数或全局作用域内的任何位置被访问,但不能在函数外部访问函数内部声明的var变量(除非该变量也被声明为全局变量)。然而,在if语句、for循环等控制结构内部声明的var变量,实际上会“泄漏”到包含这些控制结构的函数或全局作用域中。

  • let和 constlet const都引入了块级作用域的概念。这意味着它们声明的变量仅在声明它们的块(如{}包围的代码块)或包含它们的函数中可用。这使得变量在逻辑上更加封闭和可预测,有助于避免意外的变量覆盖和泄露。

var例子:

var具有函数作用域和全局作用域:

// a作为全局变量可以在aaa()中被访问到,执行aaa()函数后,a的值发生变化
        var a=1;
        function aaa(){
            a=2;
        }
        console.log(a) // 1
        aaa();
        console.log(a) // 2
// a作为函数中的局部变量可以在aaa()内部被访问到,执行aaa()函数后,a的值发生变化
        function aaa(){
            var a=2;
            if(a===2){
                a=3;
            }
            console.log(a) // 3
        }
        aaa();

var不具有块级作用域(不能在函数外部访问函数内部声明的var变量):

function aaa(){
            var a=1;
            a+=1;
        }
        aaa()
        console.log(a);

 以上代码会报错:

补充:变量提升
        {
            var a=11;
        }
        console.log(a) // 11

a并不在全局作用域中,因为它被声明在一个块级作用域{}内。但是,由于var的特性,这个变量a会被“提升”到包含它的函数(如果有的话)或全局作用域中,它在全局上下文中也是可访问的(非严格模式下执行)。然而,这种访问是通过“提升”到全局作用域(或包含函数的作用域)来实现的,而不是因为a本身就在全局作用域中声明。

(1)为什么要变量提升

变量提升简化变量和函数的使用,允许开发者在声明变量或函数之前就能使用它们。(letconst声明的变量不会被提升)

(2)变量提升具体表现
  • 对于函数声明:函数声明会被提升到其作用域的开始,即可以在函数声明之前调用该函数。

  • 对于变量声明:使用var声明的变量也会被提升到其作用域的开始,但重要的是要注意,只有声明会被提升,初始化(赋值)不会被提升。这意味着如果你在声明变量之前尝试访问它,你会得到一个undefined值,而不是错误。

例子:

 console.log(a) // 变量初始化(赋值)不会提升,在初始化之前访问会返回undefined
        var a=11
        console.log(a) // 赋值后可以访问,输出:11


        function foo() {
            console.log(bar()); // 变量提升,函数可以在声明前被调用,输出: Hello, World!
            function bar() {
                return 'Hello, World!';
            }

        }
        foo();

结果:

注:

  • 使用let和const声明的变量不会被提升。如果在声明之前访问,会报错。
  • 严格模式下,尝试访问未声明的变量(包括在var声明被提升但未初始化时访问)也会报错。

例子:

console.log(a) // let声明不会提升,在声明前访问会报错,const也是
        let a=11

报错:

2)重复声明
  • var:在同一个作用域内,使用var可以多次声明同一个变量,后面的声明会覆盖前面的声明。

  • let和 constletconst都不允许在同一作用域内重复声明同一个变量,无论是否带有初始化表达式。

例子:

var重复声明:

var a=1
        console.log(a)
        var a=2;
        console.log(a)
        var a=3;
        console.log(a)

结果:

letconst则不允许重复声明:

例子:

let a=1;
        console.log(a)
        let a=2;
        console.log(a)

报错:

3)重新赋值
  • var和 let:使用varlet声明的变量都可以被重新赋值。即,你可以改变它们的值。

  • const:使用const声明的变量必须被赋予一个初始值,且这个值在后续不能被改变(常量)。

注:const的“不可变”是指变量所引用的内存地址不可变,如果变量引用的是一个对象或数组,则可以修改对象或数组内部的属性或元素,但不能将变量重新指向一个新的对象或数组。

例子:

let a=1;
        console.log(a) // 1
        a=2;
        console.log(a) // 2
const a=1;
        console.log(a) // 1
        a=2;
        console.log(a) // 报错

const修改常量报错:

const可以修改对象或数组内部的属性或元素:

const obj = {
            a:1,
            b:2
        }
        console.log(obj.a) // 1
        obj.a=2;
        console.log(obj.a) // 2

11.null和undefined区别

1)定义
  • undefined:表示变量已经声明,但是还没有被赋值,是变量未定义时的默认值。
  • null:表示空值或空引用,用于表示某个变量将来可能指向一个对象,但目前没有指向任何对象。null通常用于主动释放指向对象的引用,或者表示某个值或对象不存在。
2)类型

使用typeof进行类型检测时,undefined类型为“undefined”,null类型为“object”。

使用isNaN进行数字转化时,undefined转化为NaN,null会转化为数字0。

        let a;
        let b=null;
        console.log(typeof a) // undefined
        console.log(typeof undefined) // undefined
        console.log(isNaN(a)) // true

        console.log(typeof null) // object
        console.log(typeof b) // object
        console.log(isNaN(b)) // false

12.操作数组有哪些原生方法

JS:33种原生JS数组方法(8种改变原数组方法,25种不涉及数组改变的方法)_js 改变原数组的方法-CSDN博客

13.以下语句输出什么:

var a;

alert(typeof(a));

alert(b);

了解了前面的知识之后,这题就简单了:

弹窗输出:undefined

报错:b is not defined

14.以下语句输出什么:

var undefined;

        console.log(undefined==null); // true

        console.log(1==true); // true
        console.log(2==true); // false
        console.log(0==false); // true
        console.log(0==''); // true
        console.log(NaN==NaN); // false
        console.log([]== false) // true

console.log()

==(非严格等于)操作符会进行类型转换

  1. console.log(undefined == null);   // true

    undefined 和null在使用==进行比较时会被视为相等

  2. console.log(1==true);   // true

    js中,当使用==比较时,数字1会被视为真值(truthy),而true本身就是真值。因此相等。

  3. console.log(2==true);   // false

    这里2是真值,但true并不等同于数值2,所以它们不相等。

  4. console.log(0==false);   // true

    在js中,0被视为假值(falsy),而false也是假值。当使用==进行比较时相等。

  5. console.log(0=='');   // true

    空字符串''被视为假值,就像0一样。因此,当使用==进行比较时,被视为相等。

  6. console.log(NaN == NaN);   //false

    NaN与任何值(包括它自己)使用==或===比较时都返回false。

  7. console.log([] == false);   // true

    空数组[]被视为真值(truthy),但实际上,当它与false使用==进行比较时,空数组会被转换为数字0(因为空数组在数值上下文中被视为0),而0又被视为假值(falsy),但这里的关键是false也被视为假值,并且由于它们都处于假值,所以被视为相等。

如果题中全部改成严格意义相等===,则全部返回false,===操作符要求值和类型都必须相同:

        var undefined;

        console.log(undefined===null); // false

        console.log(1===true); // false
        console.log(2===true); // false
        console.log(0===false); // false
        console.log(0===''); // false
        console.log(NaN===NaN); // false
        console.log([]=== false) // false
  1. console.log(undefined === null);   // false

    这个返回false是因为undefined 和null虽然都表示“无”或“空”的概念,但它们类型不同。undefined 的类型是undefined ,而null的类型是object。

  2. console.log(1 === true);   // false

    这个返回false因为1 是一个数字,而true是一个布尔值。使用===时不会进行类型转换,所以不相等。

  3. console.log(2 === true);   // false

    同上,2是数字类型,而true是布尔类型,类型不同。

  4. console.log(0 === false);   // false

    尽管在某些上下文中,0和false在逻辑上可能被视为等价,但它们的类型是不同的。0是数字类型,而false是布尔类型,不相等。

  5. console.log(0 === '');   // false

    类型不同。

  6. console.log(NaN === NaN);   //false

    NaN 与任何值(包括它自己)使用===比较时都返回false。这是因为NaN 被设计为与任何值都不相等,包括它自己。

  7. console.log([] === false);   // false

    同上,类型不同。

补充:
真值与true:

在js中,真值(truthy)和true是两个不同的概念,没有一个值严格等同于true(即使用===操作符比较时相等),除了true本身。

  • 真值(Truthy):在布尔上下文中,JavaScript会将某些值视为真(truthy),这些值在逻辑表达式中会被当作true。例如,非零数字、非空字符串、非空对象(包括数组)等都是真值。但是,这并不意味着这些真值在比较时等同于true。

  • true:这是一个布尔类型的字面量,表示严格的真。

  • 使用===与true进行比较时,只有true本身才会被认为是相等的(true === true,结果为true,其余结果为false)。

15.以下语句输出什么:

function cart(){
    console.log(a);
    alert(a);
}
function foo(){
    var a=100;
    cart();
}
var a=200;
foo();

运行结果:

原因:

定义全局变量a=200,执行函数foo(),在foo()中有局部变量a=100,然后执行cart(),在cart()中访问不到局部变量,所以输出为全局变量a,值为200。

16.获取当前时间,形式为“YYYY-MM-DD”

例子:

function getDateTime(){
           const nowDate = new Date();

           let year = nowDate.getFullYear(); // 获取年份
           let month = (nowDate.getMonth() + 1).toString().padStart(2,'0'); // 月份从0开始,所以要+1,padStart确保两位数
           let day = nowDate.getDay().toString().padStart(2,'0'); //获取日期

           return `${year}-${month}-${day}` // 形如YYYY-MM-DD
       }

       console.log(getDateTime())

结果:

17.合并两个数组并删掉第二个元素

1)使用concat()合并数组,并使用splice()删除第二个元素
        let array1 = [1, 2, 3];
        let array2 = [4, 5, 6];

        // 使用concat()合并数组
        let mergedArray = array1.concat(array2);

        // 删除合并后数组的第二个元素
        mergedArray.splice(1,1); // 从索引1开始删除1个元素

        console.log(mergedArray); // 输出: [1, 3, 4, 5, 6]
2)使用扩展运算符(...)和splice()
        let array1 = [1, 2, 3];
        let array2 = [4, 5, 6];

        // 使用扩展运算符合并数组
        let mergedArray = [...array1, ...array2];

        // 删除合并后数组的第二个元素
        mergedArray.splice(1, 1); // 从索引1开始删除1个元素

        console.log(mergedArray); // 输出: [1, 3, 4, 5, 6]

18.js写方法消除字符串中的重复内容,比如“aabbbbbcccd”,消除后为“abcd”

Javascript中字符串去重的方法总结_js字符串去重-CSDN博客

function removeDuplicates(str) {  
  let result = '';  
  for (let char of str) {  
    // 如果当前字符不在结果字符串中,则将其添加到结果字符串  
    if (!result.includes(char)) {  
      result += char;  
    }  
  }  
  return result;  
}  
  
// 示例  
console.log(removeDuplicates("aabbbbbcccd")); // 输出 "abcd"
function removeDuplicatesOptimized(str) {  
  let seen = new Set(); // 创建一个集合来存储已经看到的字符  
  let result = '';  
  for (let char of str) {  
    // 如果集合中没有这个字符,则添加到集合和结果字符串中  
    if (!seen.has(char)) {  
      seen.add(char);  
      result += char;  
    }  
  }  
  return result;  
}  
  
// 示例  
console.log(removeDuplicatesOptimized("aabbbbbcccd")); // 输出 "abcd"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式系统】Ceph应用之资源池pool管理

目录 一.资源池Pool管理 1.查看资源池信息 1.1.查看资源池副本的数量 1.2.查看 PG 和 PGP 数量 2.修改资源池 2.1.修改 pg_num 和 pgp_num 的数量为 128 2.2.修改 Pool 副本数量为 2 2.3.修改默认副本数为 2 2.4.推送 ceph.conf 配置文件给所有 mon 节点 2.5.去node节…

搭建企业平台:聚合优势资源,优化服务

国际数字影像产业园在加强服务支持与资源整合方面取得了显著成效。通过提供全生命周期服务方案、搭建多元化服务平台、提供政策咨询与行政审批支持、技术与创新支持等措施&#xff0c;为入园企业提供了全方位、便捷、高效的服务支持。同时&#xff0c;通过整合产业链资源、加强…

Xshell配置ssh免密码登录(密钥登陆)

文章目录 一、Xshell登陆步骤 一、Xshell登陆步骤 1.生成客户端的公钥私钥 2.生成公钥文件 3.生成私钥文件 4.将公钥传输进要登录的服务器中 5.修改公钥文件名为authorized_keys (authorized_keys是用于存储公钥的特殊文件,如果已经有了这份文件,可以在末尾追加) 6.连…

香橙派5plus上跑云手机方案二 waydroid

前言 上篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)说了怎么跑带GPU加速的redroid方案&#xff0c;这篇说下怎么在香橙派下使用Waydroid。 温馨提示 虽然能运行&#xff0c;但是体验下来只能用软件加速&#xff0c;无法使用GPU加速&#xff0c;所有会很卡。而且…

差分算法中的F 和CR参数

自查使用。。F 类似梯度的大小 两者都用于种群中新个体的生成

Phospho:LLM应用的文本分析利器

今天向大家介绍phospho文本分析平台&#xff0c;专门为大型语言模型&#xff08;LLM&#xff09;应用程序设计。它可以帮助开发者从用户或应用程序的文本消息中检测问题、提取洞见、收集用户反馈&#xff0c;并衡量成功。作为一个开源项目&#xff0c;phospho允许开发者查看和修…

智慧城市的建设乃民之福音,建议普及这一技术

**智慧城市的建设乃民之福音&#xff0c;建议普及这一技术** 智慧城市已成为城市现代化的关键。智慧城市的建设不仅提高了城市管理的效率&#xff0c;还为市民带来了诸多便利。因此&#xff0c;我们应当积极推广并普及智慧城市技术&#xff0c;让这一福祉惠及更多民众。 如需…

圆屋顶下,神的盛宴

你有没有想过&#xff0c;自己头顶的是什么&#xff1f; 其实&#xff0c;有很多种可能&#xff1a; 比如&#xff0c;你头顶的当然就是你的头发&#xff1b;但也有可能你剃了个光头&#xff0c;所以你的头顶是秃的&#xff0c;不过没关系&#xff0c;你如果在房间里&#xff…

android13 cat /proc/cupinfo没有Serial问题

1.前言 我们有些客户是使用cpuinfo节点去获取系统的cpuid的,如下: cat /proc/cupinfo processor : 0 BogoMIPS : 48.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU impleme…

godis源码分析——Redis协议解析器

前言 redis这个目录下的所有代码就是为了一个事情&#xff0c;就是适配redis。 流程 redis下的基本流程 源码 在redis/client/client.go 主要是客户端处理 package clientconst (created iotarunningclosed )type B struct {data chan stringticker *time.Ticker }// …

ubuntu 上vscode +cmake的debug调试配置方法

在ubuntu配置pcl点云库以及opencv库的时候&#xff0c;需要在CMakeLists.txt中加入相应的代码。配置完成后&#xff0c;无法调试&#xff0c;与在windows上体验vs studio差别有点大。 找了好多调试debug配置方法&#xff0c;最终能用的有几种&#xff0c;但是有一种特别好用&a…

‘wget‘ 不是内部或外部命令,也不是可运行的程序

在Windows环境下创建了虚拟环境并安装了wget包&#xff0c;但在使用该命令的时候仍然报错&#xff0c;‘wget’ 不是内部或外部命令,也不是可运行的程序 解决方案&#xff1a; 去官网下载对应位数的.exe文件&#xff0c;将其放在C:\Windows\System32目录下即可, 别下错版本&a…

常见WAF拦截页面总结

(1) D盾 (2) 云锁 (3) UPUPW安全防护 (4) 宝塔网站防火墙 (5) 网防G01 (6) 护卫神 (7) 网站安全狗 (8) 智创防火墙 (9) 360主机卫士或360webscan (10) 西数WTS-WAF (11) Naxsi WAF (12) 腾讯云 (13) 腾讯宙斯盾 (14) 百度云 图片 (15) 华为云 (16) 网宿云 (17) 创宇盾 图片 (…

首届UTON区块链开发者计划大会在马来西亚圆满落幕

7月9日&#xff0c;首届UTON区块链开发者计划大会在马来西亚吉隆坡成功举办&#xff01; 来自全球顶尖的行业领袖、技术精英和众多区块链爱好者参与了此次盛会&#xff0c;也标志着UTON区块链生态进入了一个全新的发展阶段。 会上&#xff0c;UTON区块链创始人之一唐毅先生以“…

leetcode:1332. 删除回文子序列(python3解法)

难度&#xff1a;简单 给你一个字符串 s&#xff0c;它仅由字母 a 和 b 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符&#xff08;字符串为空&#xff09;的最小删除次数。 「子序列」定义&#xff1a;如果一个字符串可以通过删除原字…

Qt开发 | qss介绍及控件应用 | qss加载方式 | 控件提升 | 鼠标位置与控件位置 | 搜索编辑框 | tab在左文本水平的tabWidget

文章目录 一、qss简介与应用二、QLineEdit qss介绍与使用三、QPushButton qss1.常用qss1.1 基本样式表1.2 背景图片1.3 图片在左文字在右 2.点击按钮弹出菜单以及右侧箭头样式设置3.鼠标悬浮按钮弹出对话框 四、QCheckBox qss妙用&#xff1a;实时打开关闭状态按钮五、QComboBo…

react基础语法,模板语法,ui渲染,jsx,useState状态管理

创建一个react应用 这里使用create-react-app的脚手架构建项目&#xff08;结构简洁&#xff0c;基于webpack-cli&#xff09;&#xff0c; npx create-react-app [项目名称] 使用其他脚手架构建项目可以参考&#xff1a;react框架&#xff0c;使用vite和nextjs构建react项目…

ch552g中使用SPI进行主从机通信时发现的问题

参考 基本硬件准备 两块独立的ch552g的板子&#xff0c;开始连接时数据传输出现数据错误&#xff0c;本来猜想是通信线连接问题&#xff0c;后来用了较短的连接线依然没有改善。 SPI通信的认知 SPI一般都是全双工实时通信&#xff0c;所以在发送数据时一般有短暂的停留使得…

echarts使用自定义图形实现3D柱状图

先看下效果吧 实现思路 使用graphic创建并注册自定义图形。根据每组的数据值&#xff0c;得到一个对应的点&#xff0c;从点出发用canvas绘制一组图形&#xff0c;分别为 顶部的菱形 const CubeTop echarts.graphic.extendShape({buildPath: function (ctx, shape) {const c1…

【ComfyUI的API接口调用示例】

ComfyUI的API接口调用示例 本文目的 本文调用接口示例主要指导需要调用ComfyUI的开发者如何调用ComfyUI官方的API接口提交任务、查询历史、获取绘画视频结果等。 阅读本文的前提是你本地已经安装了ComfyUI&#xff0c;并且对工作流绘画和生成视频已经有所了解。注意如图右边栏…