JavaScript相关问题

汇总常见技术疑问、解决思路和实践经验。

问题答案 12026年7月4日 12:35

JavaScript可以与MySQL连接吗?

JavaScript 本身是一种在浏览器端执行的脚本语言,而 MySQL 是一种服务端的数据库管理系统。直接在客户端的 JavaScript 中连接到 MySQL 数据库是不被推荐的,也通常是不可能的,因为这样做会暴露数据库的登录凭证,极大地增加安全风险。然而,JavaScript 可以通过服务器端脚本与 MySQL 数据库进行交互。这种情况下,客户端的 JavaScript 会发送请求到一个服务器(例如使用 Node.js 构建的服务器),然后由服务器端的代码来处理与 MySQL 数据库的连接和数据交换。这种架构被广泛用于现代的 web 应用中,确保了数据的安全性和高效的数据处理。例如,使用 Node.js,您可以使用 或 这样的库来实现与 MySQL 数据库的连接和操作。下面是一个简单的示例,展示了如何在 Node.js 中使用 库连接到 MySQL 数据库:这个例子中,首先通过 引入 模块,然后创建一个连接对象并连接到 MySQL。在连接成功之后,可以执行 SQL 查询或其他操作,最后关闭数据库连接。这样的处理确保了数据库操作的安全性和数据的完整性。
问题答案 12026年7月4日 12:35

JavaScript 如何从cookie中创建和读取值?

在JavaScript中处理cookie主要涉及以下几个步骤:创建、读取和设置过期时间。我将逐一解释这些步骤,并给出相应的代码示例。创建Cookie我们可以使用 属性来创建cookie。创建cookie主要是给 赋值,这个值是一个字符串,通常包含cookie的名称、值以及其他可选的属性(如过期时间、路径和域)。在这个例子中,函数接收三个参数:(cookie的名称),(cookie的值),以及 (cookie的有效期,以天为单位)。如果提供了天数,我们计算出具体的过期日期并设置。最后,我们通过 将cookie设置到浏览器中。读取Cookie读取cookie时,我们同样使用 属性。这个属性包含一个字符串,其中包括了所有设置在当前域下的cookie(名称和值)。我们需要编写函数来解析这个字符串,以便找到我们感兴趣的特定cookie的值。这个 函数会查找与指定名称匹配的cookie。它通过分割 字符串来遍历所有cookie,并检查每一个cookie的名称是否与我们提供的名称匹配。设置Cookie过期在创建cookie时,我们已经触及了设置过期时间的方法,即在 函数中使用 属性。如果我们需要删除一个cookie,只需要将它的过期时间设置为一个过去的时间即可。这个 函数通过设置cookie的过期时间为1970年1月1日(一个过去的时间),从而使浏览器删除该cookie。以上就是在JavaScript中使用cookie的基本操作。希望这能帮助您了解如何在Web应用中处理cookie。
问题答案 12026年7月4日 12:35

如何使用Javascript获取OpenGL版本?

在JavaScript中,要获取OpenGL版本,通常需要通过WebGL来访问,WebGL基于OpenGL ES,它是OpenGL的一个子集,专为Web开发设计。下面是一个步骤明确的示例,展示如何在JavaScript中获取WebGL的版本,从而间接获取到OpenGL ES的版本信息。步骤 1: 创建Canvas元素首先,你需要在HTML文档中创建一个canvas元素,或者通过JavaScript动态创建一个。步骤 2: 获取WebGL上下文使用方法来获取WebGL上下文。这里有两种可能的上下文,(或称为WebGL 1.0,基于OpenGL ES 2.0)和(WebGL 2.0,基于OpenGL ES 3.0)。步骤 3: 获取并打印OpenGL版本信息一旦你有了WebGL上下文,就可以使用方法来查询WebGL的相关信息,其中和是很有用的参数,分别代表WebGL的版本和着色语言版本。示例说明这个示例代码首先尝试获取WebGL的上下文,如果浏览器支持WebGL,则会打印出WebGL的版本和着色语言版本。这些信息间接反映了底层的OpenGL ES版本。注意: WebGL的版本和对应的OpenGL ES版本是固定对应的,WebGL 1.0 基于 OpenGL ES 2.0,而 WebGL 2.0 基于 OpenGL ES 3.0。所以通过获取WebGL版本,你可以推断出OpenGL ES的版本。结论通过上述步骤,你可以在JavaScript中间接获取到OpenGL ES的版本信息。这对于开发依赖特定图形功能的Web应用非常有用,确保应用能够在大多数设备上正确运行。
问题答案 12026年7月4日 12:35

Javascript 如何实现浏览器并发请求,并发请求上限支持配置?

在JavaScript中,实现浏览器的并发请求通常利用 或 API来发送HTTP请求。不过,并发请求的数量由浏览器本身控制,不同的浏览器有不同的限制。例如,旧版本的浏览器可能限制每个域名下的并发请求为6个,而新版本的浏览器可能更高。但是,如果你想在代码层面控制并发请求的数量,可以使用一些技术手段和第三方库来实现。下面我将详细解释一种常用的方法和一个示例。使用 Promise 和 async/await 控制并发我们可以使用 Promise 结合 async/await 来控制并发请求的数量。这种方法不依赖于特定的库,而是利用JavaScript自身的特性来控制异步请求的并发数。这里我将给出一个示例,展示如何使用这种方法来限制并发请求的数量,假设我们用fetch API来发送请求:在上面的代码中,函数接收一个URL数组和一个并发限制参数 。函数内部维护了一个 数组来跟踪当前正在处理的请求,当当前请求少于 时,会从 数组中取出新的URL进行请求。每当一个请求完成时,就从 数组中移除,并尝试请求下一个URL,直到所有URL都被请求完成。这种方法的优点是它不依赖于任何外部库,完全使用原生JavaScript,易于理解和实现。缺点是需要手动管理请求的队列和并发,稍显复杂。 结论通过上述方法,我们可以灵活地在应用中控制请求的并发数量,从而优化资源使用,提高应用性能。如果有需要处理大量请求和复杂的并发控制,也可以考虑使用像 这样的第三方库来简化代码。
问题答案 12026年7月4日 12:35

JavaScript中处理异常的方法有哪些?

在JavaScript中处理异常,通常我们会使用以下几种方法来确保代码的健壮性和错误处理能力:1. try…catch 语句这是处理运行时错误最常见的方法。块中包含了可能抛出错误的代码,而块会捕获到这些错误,让开发者有机会处理它们。示例代码:2. finally 语句通常与结合使用。无论块内的代码是否成功执行,块中的代码都会被执行,常用于清理或释放资源。示例代码:3. throw 关键字使用关键字可以手动抛出异常。这允许开发者在代码执行中的任何点生成自定义错误。示例代码:4. Promise 的错误捕获在处理异步操作时,Promise 提供了方法来专门捕获异步操作中发生的异常。示例代码:5. 使用 Async/Await 的 try…catch当使用ES8引入的async和await进行异步编程时,可以直接在这种语法中使用来处理异步操作中的异常。示例代码:通过这些方法,我们可以有效地处理在JavaScript代码执行过程中可能出现的各种错误和异常,从而提高程序的稳定性和用户体验。
问题答案 12026年7月4日 12:35

“setInterval”与“setTimeout”进行对比

当谈到JavaScript中的定时器,和是两个经常被用来处理时间延迟和周期性执行代码的函数。它们各自有着不同的用途和特点,下面我将详细地比较这两者。1. 基本功能setTimeout:函数用来设定一个延时,让某段代码或函数在指定的延时后执行一次。语法: 例如,如果想在3秒后执行一个函数,可以这样使用:setInterval:函数用来设定一个间隔时间,让某段代码或函数以指定的时间间隔重复执行。语法: 例如,如果想每3秒打印一次消息,可以这样使用:2. 使用场景setTimeout:当你希望在一定时间后执行一次任务或计算时使用。例如,在Web页面中,可能需要在用户完成某些操作后,延时执行某些清理或保存的操作。另一个场景是,实现类似“节流”(Throttle)的效果,避免函数在短时间内被频繁调用。setInterval:当你需要每隔一定时间重复执行一段代码时使用。例如,可能需要每隔一段时间从服务器获取最新数据,或者更新页面上的倒计时显示。也常用于实现动画效果,如轮播图的自动切换。3. 取消定时器这两个函数都可以被清除,防止它们继续执行。返回一个定时器的标识符,可以用 来取消延时执行。同样返回一个定时器的标识符,可以用 来停止间隔执行。4. 注意事项可能会遇到“堆叠效应”。如果定时器的回调函数执行时间长于设定的间隔,回调函数的调用会开始堆积。这可能导致性能问题。可以通过递归调用自身来模拟 的效果,同时避免“堆叠效应”。5. 实例应用假设我们正在构建一个网页,需要在用户输入完成后,延迟2秒显示输入内容的预览,并且要保证这段时间如果用户再次输入,之前的延时会被取消并重新计算。相比之下,如果我们需要实时更新一个数字时钟,则更适合使用 :结论和 都是处理定时任务的有力工具,但它们适用的场景不同。选择哪一个取决于你是否需要一次性延迟执行还是需要周期性地执行代码。
问题答案 12026年7月4日 12:35

为什么在数组迭代中使用“for…In”不是一个很好的方式?

在JavaScript中,使用“for…in”循环来迭代数组通常不是一个好的做法,主要有以下几个原因:非数组元素的迭代:“for…in”循环是为遍历对象属性而设计的,而不仅仅是数组。当使用“for…in”来遍历数组时,它不仅会遍历数组中的所有元素,还可能遍历到数组对象的其他可枚举属性。这意味着除了数组元素,可能还会遍历到一些非预期的属性,导致代码出现意外行为。示例:顺序问题:“for…in”循环不能保证按照数组索引的顺序进行迭代。这可能会导致一些基于顺序的逻辑出现错误。性能问题:与其他数组迭代方法(如“for”循环或“Array.prototype.forEach”)相比,“for…in”循环的效率通常较低。这是因为它需要处理对象的键的额外复杂性,而不仅仅是处理简单的数组索引。因此,如果你需要迭代数组,更推荐使用专门为数组设计的迭代方法,如“for”循环、、等,这些方法提供了更清晰、更高效、更可靠的迭代方式。更好的选择示例:这些方法都可以更加直接和安全地遍历数组元素,而无需担心非元素属性的干扰或顺序问题。
问题答案 12026年7月4日 12:35

如何使用 Javascript 将 div 生成 pdf

在Web开发中,将HTML元素(如div)转换成PDF是一个常见的需求,可以通过多种JavaScript库来实现。下面我将介绍一个常用的库——jspdf,并结合html2canvas来演示如何实现这一功能。使用jspdf和html2canvas步骤1: 引入库首先,你需要在你的HTML文件中引入jspdf和html2canvas。你可以通过CDN来快速引入这两个库:步骤2: 创建按钮触发PDF生成在你的HTML中,你可以添加一个按钮,当用户点击这个按钮时触发PDF生成的功能:步骤3: 编写JavaScript函数在你的JavaScript文件或者标签中,添加以下代码:解释获取元素: 我们首先获取需要转换成PDF的HTML元素。生成Canvas: 使用将DOM元素渲染成Canvas。这个库能够处理CSS样式并正确渲染出视觉效果。转换图片: 将Canvas转换成图片数据(data URL)。创建PDF: 使用jspdf库创建PDF文件,并计算图片应该在PDF中的尺寸,保持原有的比例。添加图片到PDF: 将图片添加到PDF文件中。保存PDF: 最后,我们通过方法保存生成的PDF文件,用户可以下载该文件。这个方法可以非常灵活地应对各种HTML内容的PDF生成,同时保留了样式和布局。这只是一个基础的例子,jspdf和html2canvas还支持更多高级功能,可以根据需要进行探索和使用。
问题答案 12026年7月4日 12:35

JavaScript 中 isNaN 函数的作用是什么

函数在 JavaScript 中用于检查一个值是否是非数字值。 是 "is Not a Number" 的缩写。当你需要确定一个值是否为NaN时,这个函数非常有用,尤其是在处理数学计算和数据类型转换的时候。功能说明函数会尝试将一个值转换为数字。如果值不能被转换成数字,那么返回 ,表示这是一个"非数字",如果可以转换成数字,那么返回 。使用场景举例数据验证:当从用户那里获取数据并期待数字输入时,可以用 来验证输入是否为有效的数字。比如,如果你在制作一个金融应用,需要用户输入他们的年收入,使用 可以帮助确保输入的是数字。数据处理:在进行数学运算前检查数据,确保不会因为非数字值而导致错误。注意事项是一种特殊的值,它与自身不相等,这是 JavaScript 中的一个独特现象。即使 的结果是 。本身会尝试将参数转换为数字,这意味着非数字类型的值(如字符串)在转换过程中可能被认为是数字(比如字符串 "123" 会被看作数字 123)。这些例子和解释展示了 在 JavaScript 编程中用于增强代码健壮性和验证输入的重要性。
问题答案 12026年7月4日 12:35

JavaScript和ASP脚本哪个更快?

JavaScript 和 ASP 脚本都有其各自的使用场景和优势,究竟哪一个更快,需要根据具体的使用环境和应用场景来分析。JavaScript 的优势和特点:客户端执行:JavaScript 主要在用户的浏览器上执行,因此可以立即响应用户的操作,不需要每次都与服务器进行通信。减少服务器负载:由于大部分处理工作可以在客户端完成,所以可以显著减少服务器的负载。交互性:JavaScript 非常适合创建动态的交互效果,增强用户体验。ASP 脚本的优势和特点:服务器端执行:ASP 是在服务器上执行的,这意味着它可以执行更复杂的操作,比如访问数据库、处理大量的数据等。安全性:由于代码在服务器端运行,用户无法看到源代码,这可以提高应用程序的安全性。跨浏览器兼容性:服务器端脚本不依赖于用户的浏览器类型,因此可以保证一致的功能实现。哪一个更快?对于客户端操作:JavaScript 往往能提供更快的响应时间,因为它无需进行网络通信即可在用户的设备上直接执行。对于涉及服务器处理的操作:ASP 可能更合适,尤其是当处理复杂的数据或需要强大的服务器资源时。虽然这可能涉及网络延迟,但对于服务器端处理来说,这是必要的。实际应用例子:假设我们需要一个网页表单,用户填写信息后,这些信息需要存储到服务器的数据库中。在这种情况下,JavaScript 可以用来进行表单验证(如检查必填项是否已填写),这样可以快速给予用户反馈而不需要等待服务器响应。一旦完成验证,表单数据可以通过 ASP 脚本传送到服务器并进行相应的数据库操作。总结:选择 JavaScript 和 ASP 脚本应根据具体需求来决定。如果需要快速的客户端响应和交互,JavaScript 是更好的选择。而对于需要强大处理能力和安全性的服务器端操作,ASP 脚本更为合适。在实际的应用中,两者往往是互补的,结合使用可以发挥最大的效能。
问题答案 12026年7月4日 12:35

如何从JavaScript对象中删除属性?

在JavaScript中,从对象中删除属性有几个常用的方法。这里我将介绍两种常见的方式:使用 操作符和通过设置属性为 或 。使用 操作符是一个内置的 JavaScript 操作符,可以用来删除对象的属性。当你使用 删除对象的属性时,该属性会从对象中完全移除。示例:在这个例子中, 对象原本有三个属性:, , 。使用 后, 属性被完全从对象中删除。设置属性为 或虽然这种方式并不会从对象中移除属性,但是它可以用来清除属性的值。这在某些情况下可以作为一种快速“隐藏”属性值的方法。示例:在这个例子中, 属性没有被删除,但它的值被设置为了 ,这在打印时会显示,但在一些使用场合下,比如使用 序列化时, 属性会被忽略。总结通常情况下,如果你需要完全移除对象的属性,使用 操作符是最直接的方法。如果你只是想清空属性的值或者在不影响其他代码的情况下快速“隐藏”属性值,可以将属性值设置为 或 。每种方法都有其适用场景,选择哪种方法取决于具体需求。
问题答案 12026年7月4日 12:35

如何使用JavaScript读写文件?

在JavaScript中,读写文件的功能主要依赖于运行环境。在浏览器环境和Node.js环境中,处理文件的方式有所不同。1. 在Node.js中读写文件Node.js提供了模块(文件系统模块),这是一个用于文件操作的API。使用这个模块,我们可以非常方便地读取和写入文件。读取文件写入文件2. 在浏览器中读写文件由于浏览器的安全限制,直接在浏览器端进行文件系统的读写是不被允许的。但是,我们可以通过一些用户交互来实现文件的读取和生成。读取文件在浏览器中,可以使用元素让用户选择文件,然后使用FileReader API来读取这些文件。写入文件虽然不能直接在浏览器中保存文件到用户的本地,但可以通过创建一个下载链接使用户能够下载由网页生成的数据。以上就是在不同环境下使用JavaScript进行文件读写操作的方法。在Node.js中可以直接操作文件系统,而在浏览器中则需要通过用户交互来间接处理文件。
问题答案 12026年7月4日 12:35

使用js或者es从数组中删除最后一项

在JavaScript中,删除数组中的最后一项可以使用多种方法,其中最直接和常用的方法是使用 函数。这个函数不仅会删除数组的最后一个元素,而且还会返回被删除的元素。这样做的好处是操作简单,且 方法的时间复杂度为 O(1),因为它直接操作数组的末尾。示例假设我们有一个数组,包含一些数字:要删除这个数组的最后一个元素,我们可以使用 方法:在这个例子中, 方法移除了数组 的最后一个元素 ,并且将这个元素存储在变量 中。更多信息虽然 是最常用的方法,但JavaScript还提供其他一些方法来处理数组,例如 方法。 方法不仅可以用来删除数组中的元素,还可以用于添加或替换元素。如果你只想删除最后一个元素,使用 是最简单和直接的方法。如果你有任何其他问题或需要进一步的例子,请随时告诉我!
问题答案 12026年7月4日 12:35

可以在同一页面上使用多个版本的jQuery吗?

可以在同一页面上使用多个版本的jQuery,但这并不是推荐的做法,因为它可能会导致代码的复杂性增加和潜在的冲突。如果确实需要这样做,可以使用jQuery的方法来处理不同版本之间的冲突。使用方法的步骤如下:引入多个版本的jQuery在HTML文件中,按需引入不同版本的jQuery库。例如:释放标记的控制权一旦引入新的jQuery版本,可以立即调用方法,把控制权从新版本的jQuery转移给旧版本的jQuery或其他库。例如:这里的参数确保彻底释放对和的控制,允许你为每个版本的jQuery创建一个唯一的别名。使用别名操作特定版本的jQuery通过为每个版本指定不同的别名,我们可以在同一页面上明确使用特定版本的jQuery,防止功能混淆。例如:示例案例假设我们的项目中有一些旧的插件只兼容jQuery 1.12.4,而我们又想利用jQuery 3.5.1的一些新特性。使用上述方法,我们可以在同一页面中同时使用这两个版本,每个版本操作它们各自的功能模块,从而避免版本冲突的问题。结论尽管技术上可行,但在同一页面中使用多个版本的jQuery应当是一种权宜之计。在可能的情况下,最好通过更新代码和插件来统一使用单一版本的jQuery,以减少维护的复杂性和提高页面性能。
问题答案 12026年7月4日 12:35

使用javascript检查数组的所有值是否相等

当然,要在JavaScript中检查一个数组的所有值是否相等,我们可以采用几种不同的方法。下面我将详细解释两种常用的方法,并且提供示例代码。方法一:使用方法方法会测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值,如果所有元素都通过测试则返回,否则返回。我们可以利用这个方法来检查数组中的每个元素是否与第一个元素相等。示例代码:方法二:使用对象是一个特殊的对象类型,其中的每个值必须唯一。因此,如果我们将数组转换为,然后检查的大小,我们可以判断数组是否所有值都相等。如果的大小为1,那么数组的所有值都相等;如果大于1,则表明数组中至少有两个不同的值。示例代码:总结这两种方法各有优缺点。使用方法的代码更直观易懂,而使用方法可能在面对非常大的数组时更快,因为它依赖于内部的优化机制来处理唯一性。选择哪种方法取决于具体情况,比如数组的大小和预期的数据类型等因素。通常,方法因为其直观性被广泛使用。
问题答案 12026年7月4日 12:35

如何在页面加载时调用JavaScript函数?

在网页中调用JavaScript函数,主要有几种常用方法可以在页面加载时执行。以下是一些常见的实现方式:1. 使用标签的属性可以在HTML的标签中使用属性来调用函数。当整个页面加载完成后,包括所有的框架、图像和外部文件,指定的JavaScript函数将会被执行。示例代码:2. 使用JavaScript的通过在JavaScript中使用事件也可以实现在页面加载完成后执行函数。这种方式的优势在于不需要修改HTML结构,直接在JavaScript中处理。示例代码:3. 使用DOM的事件如果你只需要在DOM结构解析完成后就执行函数,而不需要等待像图片、样式表等外部资源的加载,可以使用事件。示例代码:4. 使用现代框架的生命周期方法如果你使用的是现代JavaScript框架(如React, Vue, Angular等),它们通常提供了生命周期方法或钩子来处理类似的需求。React 示例:这些方法可以根据具体的使用场景和需求选择。例如,如果页面依赖于外部资源完全加载,那么使用更合适;如果只需要DOM结构加载完成,更为高效。
问题答案 12026年7月4日 12:35

如何使用 jquery 查找是否存在特定 id 的 div ?

要在jQuery中检查是否存在具有特定ID的元素,您可以使用选择器,这里的是您想要查找的的ID。如果该元素存在,将返回一个大于0的值。下面是一个具体示例:在这个例子中,当文档加载完成后,我们使用来确保DOM完全加载。然后我们通过选择器找到ID为的元素,通过属性检测元素的数量。如果该属性大于0,表示页面上存在这个元素,我们就在控制台输出存在的信息,否则输出不存在的信息。这种方法简单且高效,可以应用在需要动态检查页面元素存在与否的场景中。
问题答案 12026年7月4日 12:35

如何获取$( this )选择器的子项?

在jQuery中,如果您想获取选择器的子项,可以使用方法。这个方法允许您选择当前元素的所有直接子元素。这里有一个具体的例子来说明如何使用这个方法:假设您的HTML结构如下:您可以使用以下jQuery代码来获取id为的元素的直接子元素,并进行遍历:在这个例子中,当id为的元素被点击时,它的所有直接子元素(两个和一个标签)的文本内容将被输出到控制台。此外,如果您只想选择特定类型的子元素,比如只选择标签的子元素,可以在方法中指定选择器:这样,当id为的元素被点击时,只有两个元素的文本内容会被输出,标签的文本内容则不会被处理。这是使用jQuery处理DOM元素子项的基本方法,灵活运用可以处理各种与DOM相关的动态交互需求。
问题答案 12026年7月4日 12:35

使用 javascript 如何删除字符串中的所有换行符

在JavaScript中,要删除字符串中的所有换行符,常用的方法是使用函数结合正则表达式。换行符可能包括(回车符,Carriage Return,CR)和(换行符,Line Feed,LF),不同的操作系统可能使用不同的换行符,例如Windows通常使用来表示一个新行,而UNIX/Linux使用,Mac OS旧版本使用。为了确保能处理所有环境下的换行符,可以使用一个包含和的正则表达式。以下是如何实现的示例代码:在这个例子中,函数接收一个字符串,然后使用方法和正则表达式来查找所有的换行符(或)。这个正则表达式中:是一个字符集,匹配所有和字符。表示匹配一个或多个前面的表达式,这样可以连续的换行符一起被替换掉。标志代表全局搜索,即查找整个字符串中的所有匹配项。标志代表多行搜索,这在处理多行字符串时是有用的。输出结果将是将所有行合并成一行的字符串:"这是第一行这是第二行这是第三行这是第四行"。通过这种方法可以确保字符串中不包含任何换行符,适用于需要将输出保持在单行的场景,如日志记录、数据传输等。
问题答案 12026年7月4日 12:35

Javascript 如何获取对象 key 组成的数组?

在JavaScript中,获取一个对象中所有键(key)组成的数组可以使用 方法。这个方法会返回一个包含给定对象自身可枚举属性名称的数组,不考虑原型链中的属性。示例:假设我们有一个对象如下:如果我们想获取这个对象所有的键,我们可以这样做:在这个例子中, 返回了一个数组 ,这个数组包含了对象 的所有键。使用场景:这种方法非常实用在需要遍历对象的键时,比如我们需要检查一个对象是否包含某个特定的键,或者我们需要根据键来组织数据等场合。例如,如果我们要验证对象是否含有特定的属性,可以结合使用 和 方法:这段代码检查对象 是否包含 键,如果包含则输出年龄,否则提示没有提供年龄信息。注意事项:只包括对象自身的可枚举属性,不包括继承的属性。如果对象的属性名不是字符串,比如是 Symbol 类型的键,这些键不会被 返回。在这种情况下,可以使用 或 来获取所有键,包括非字符串键和不可枚举的键。